From 02c106c7174825042cef69eb187b184e0c7543a9 Mon Sep 17 00:00:00 2001 From: lidanqing Date: Tue, 5 Mar 2019 03:50:04 +0100 Subject: [PATCH] MKLDNN: Add UT for conv_transpose_mkldnn op. (#16030) * MKLDNN: Add UT for conv_transpose_mkldnn op. test=develop * MKLDNN: Add fuse_bias check UT for conv_transpose_mkldnn op. test=develop --- paddle/fluid/operators/conv_transpose_op.cc | 6 + .../mkldnn/test_conv2d_transpose_mkldnn_op.py | 106 +++++++++++------- 2 files changed, 72 insertions(+), 40 deletions(-) diff --git a/paddle/fluid/operators/conv_transpose_op.cc b/paddle/fluid/operators/conv_transpose_op.cc index 86a140f15..c994c6f64 100644 --- a/paddle/fluid/operators/conv_transpose_op.cc +++ b/paddle/fluid/operators/conv_transpose_op.cc @@ -127,6 +127,12 @@ void Conv2DTransposeOpMaker::Make() { "output feature channels," "H is the height of the filter, and W is the width of the filter. " "We enforce groups number == 1 in the convolution transpose scenario."); + AddInput("Bias", + "(Tensor) Bias to be added to each output of filter application." + "The format of output tensor is X (one-dimensional) of size equal" + "to the number of output channels. Only used with MKL-DNN.") + .AsDispensable(); + AddOutput("Output", "(Tensor) The output tensor of convolution transpose operator. " "The format of output tensor is also NCHW."); diff --git a/python/paddle/fluid/tests/unittests/mkldnn/test_conv2d_transpose_mkldnn_op.py b/python/paddle/fluid/tests/unittests/mkldnn/test_conv2d_transpose_mkldnn_op.py index 9bcdb7b2a..cc72df51f 100644 --- a/python/paddle/fluid/tests/unittests/mkldnn/test_conv2d_transpose_mkldnn_op.py +++ b/python/paddle/fluid/tests/unittests/mkldnn/test_conv2d_transpose_mkldnn_op.py @@ -15,36 +15,22 @@ from __future__ import print_function import unittest +import numpy as np +import paddle.fluid.core as core +from paddle.fluid.tests.unittests.op_test import OpTest -from paddle.fluid.tests.unittests.test_conv2d_transpose_op import TestConv2dTransposeOp, TestWithPad, TestWithStride +from paddle.fluid.tests.unittests.test_conv2d_transpose_op import conv2dtranspose_forward_naive, TestConv2dTransposeOp -class TestMKLDNN(TestConv2dTransposeOp): - def init_op_type(self): - self.is_test = True - self.use_mkldnn = True - self.data_format = "NCHW" - self.op_type = "conv2d_transpose" - self._cpu_only = True - - def test_check_grad(self): - return +def conv2d_bias_naive(out, bias): + _, out_c, _, _ = out.shape - def test_check_grad_no_input(self): - return - - def test_check_grad_no_filter(self): - return + for l in range(out_c): + out[:, l, :, :] = out[:, l, :, :] + bias[l] + return out -class TestMKLDNNWithPad(TestWithPad): - def init_op_type(self): - self.is_test = True - self.use_mkldnn = True - self.data_format = "NCHW" - self.op_type = "conv2d_transpose" - self._cpu_only = True - +class TestConv2dTransposeMKLDNNOp(TestConv2dTransposeOp): def test_check_grad(self): return @@ -54,24 +40,64 @@ class TestMKLDNNWithPad(TestWithPad): def test_check_grad_no_filter(self): return - -class TestMKLDNNWithStride(TestWithStride): def init_op_type(self): - self.is_test = True - self.use_mkldnn = True self.data_format = "NCHW" self.op_type = "conv2d_transpose" self._cpu_only = True - def test_check_grad(self): - return - - def test_check_grad_no_input(self): - return - - def test_check_grad_no_filter(self): - return - - -if __name__ == '__main__': - unittest.main() + def init_test_case(self): + self.use_mkldnn = True + self.is_test = True + self.pad = [0, 0] + self.fuse_bias = False + self.bias_size = None + self.fuse_relu = False + self.stride = [1, 1] + self.dilations = [1, 1] + self.input_size = [2, 3, 5, 5] # NCHW + f_c = self.input_size[1] + self.filter_size = [f_c, 6, 3, 3] + self.groups = 1 + + def setUp(self): + TestConv2dTransposeOp.setUp(self) + + output = self.outputs['Output'] + + if self.fuse_bias and self.bias_size is not None: + bias = np.random.random(self.bias_size).astype(self.dtype) + output = conv2d_bias_naive(output, bias) + output = output.astype(self.dtype) + self.attrs['fuse_bias'] = self.fuse_bias + self.inputs['Bias'] = OpTest.np_dtype_to_fluid_dtype(bias) + + if self.fuse_relu: + output = np.maximum(output, 0).astype(self.dtype) + + self.attrs['fuse_bias'] = self.fuse_bias + self.attrs['fuse_relu'] = self.fuse_relu + + self.outputs['Output'] = output + + +class TestMKLDNNFuseBias(TestConv2dTransposeMKLDNNOp): + def init_test_case(self): + TestConv2dTransposeMKLDNNOp.init_test_case(self) + self.pad = [1, 1] + self.fuse_bias = True + self.bias_size = [6] + + +class TestMKLDNNWithPad(TestConv2dTransposeMKLDNNOp): + def init_test_case(self): + TestConv2dTransposeMKLDNNOp.init_test_case(self) + self.pad = [1, 1] + self.input_size = [2, 3, 10, 10] + + +class TestMKLDNNWithStride(TestConv2dTransposeMKLDNNOp): + def init_test_case(self): + TestConv2dTransposeMKLDNNOp.init_test_case(self) + self.pad = [1, 1] + self.stride = [2, 2] + self.input_size = [2, 3, 6, 6] # NCHW -- GitLab