Beispiel #1
0
    def forward(self, input, expand_ratio=None, channel=None):
        self.cur_config = {'expand_ratio': expand_ratio, 'channel': channel}
        ### weight: (Cin, Cout)
        in_nc = int(input.shape[-1])
        assert (
            expand_ratio == None or channel == None
        ), "expand_ratio and channel CANNOT be NOT None at the same time."
        if expand_ratio != None:
            out_nc = int(expand_ratio * self.base_output_dim)
        elif channel != None:
            out_nc = int(channel)
        else:
            out_nc = self.output_dim

        weight = self.weight[:in_nc, :out_nc]
        if self._bias_attr != False:
            bias = self.bias[:out_nc]
            use_bias = True

        pre_bias = _varbase_creator(dtype=input.dtype)
        core.ops.matmul(input, weight, pre_bias, 'transpose_X', False,
                        'transpose_Y', False, "alpha", 1)
        if self._bias_attr != False:
            pre_act = dygraph_utils._append_bias_in_dygraph(
                pre_bias, bias, axis=len(input.shape) - 1)
        else:
            pre_act = pre_bias

        return dygraph_utils._append_activation_in_dygraph(pre_act, self._act)
Beispiel #2
0
    def forward(self, input):
        if not in_dygraph_mode():
            _logger.error("NOT support static graph")

        feature_dim = int(input.shape[1])

        weight = self.weight[:feature_dim]
        bias = self.bias[:feature_dim]
        mean = self._mean[:feature_dim]
        variance = self._variance[:feature_dim]

        mean_out = mean
        variance_out = variance

        attrs = ("momentum", self._momentum, "epsilon", self._epsilon,
                 "is_test", not self.training, "data_layout",
                 self._data_layout, "use_mkldnn", False, "fuse_with_relu",
                 self._fuse_with_relu, "use_global_stats",
                 self._use_global_stats, 'trainable_statistics',
                 self._trainable_statistics)
        batch_norm_out, _, _, _, _, _ = core.ops.batch_norm(
            input, weight, bias, mean, variance, mean_out, variance_out,
            *attrs)
        return dygraph_utils._append_activation_in_dygraph(batch_norm_out,
                                                           act=self._act)
    def forward(self, input, config):
        in_nc = int(input.shape[1])
        out_nc = int(config['channel'])
        weight = self.weight[:in_nc, :out_nc, :, :]
        if in_dygraph_mode():
            op = getattr(core.ops, self._op_type)
            out = op(input, weight, 'output_size', self._output_size,
                     'strides', self._stride, 'paddings', self._padding,
                     'dilations', self._dilation, 'groups', self._groups,
                     'use_cudnn', self._use_cudnn)
            pre_bias = out
            if self.bias is not None:
                bias = self.bias[:out_nc]
                pre_act = dygraph_utils._append_bias_in_dygraph(
                    pre_bias, bias, 1)
            else:
                pre_act = pre_bias

            return dygraph_utils._append_activation_in_dygraph(pre_act,
                                                               act=self._act)

        check_variable_and_dtype(input, 'input',
                                 ['float16', 'float32', 'float64'],
                                 "SuperConv2DTranspose")

        inputs = {'Input': [input], 'Filter': [weight]}
        attrs = {
            'output_size': self._output_size,
            'strides': self._stride,
            'paddings': self._padding,
            'dilations': self._dilation,
            'groups': self._groups,
            'use_cudnn': self._use_cudnn
        }

        pre_bias = self._helper.create_variable_for_type_inference(
            dtype=input.dtype)
        self._helper.append_op(type=self._op_type,
                               inputs=inputs,
                               outputs={'Output': pre_bias},
                               attrs=attrs)

        if self.bias is not None:
            pre_act = self._helper.create_variable_for_type_inference(
                dtype=self._dtype)
            self._helper.append_op(type='elementwise_add',
                                   inputs={
                                       'X': [pre_bias],
                                       'Y': [bias]
                                   },
                                   outputs={'Out': [pre_act]},
                                   attrs={'axis': 1})
        else:
            pre_act = pre_bias

        out = self._helper.append_activation(pre_act, act=self._act)
        return out
Beispiel #4
0
    def forward(self,
                input,
                kernel_size=None,
                expand_ratio=None,
                channel=None):
        self.cur_config = {
            'kernel_size': kernel_size,
            'expand_ratio': expand_ratio,
            'channel': channel
        }
        in_nc = int(input.shape[1])
        assert (
            expand_ratio == None or channel == None
        ), "expand_ratio and channel CANNOT be NOT None at the same time."
        if expand_ratio != None:
            out_nc = int(expand_ratio * self.base_channel)
        elif channel != None:
            out_nc = int(channel)
        else:
            out_nc = self._num_filters
        ks = int(
            self._filter_size[0]) if kernel_size == None else int(kernel_size)

        groups, weight_in_nc, weight_out_nc = self.get_groups_in_out_nc(
            in_nc, out_nc)

        weight = self.get_active_filter(weight_in_nc, weight_out_nc, ks)

        if kernel_size != None or 'kernel_size' in self.candidate_config.keys(
        ):
            padding = convert_to_list(get_same_padding(ks), 2)
        else:
            padding = self._padding

        if self._l_type == 'conv2d':
            attrs = ('strides', self._stride, 'paddings', padding, 'dilations',
                     self._dilation, 'groups', groups if groups else 1,
                     'use_cudnn', self._use_cudnn)
            out = core.ops.conv2d(input, weight, *attrs)
        elif self._l_type == 'depthwise_conv2d':
            attrs = ('strides', self._stride, 'paddings', padding, 'dilations',
                     self._dilation, 'groups',
                     groups if groups else self._groups, 'use_cudnn',
                     self._use_cudnn)
            out = core.ops.depthwise_conv2d(input, weight, *attrs)
        else:
            raise ValueError("conv type error")

        pre_bias = out
        out_nc = int(pre_bias.shape[1])
        if self.bias is not None:
            bias = self.bias[:out_nc]
            pre_act = dygraph_utils._append_bias_in_dygraph(pre_bias, bias, 1)
        else:
            pre_act = pre_bias

        return dygraph_utils._append_activation_in_dygraph(pre_act, self._act)
Beispiel #5
0
    def forward(self,
                input,
                kernel_size=None,
                expand_ratio=None,
                channel=None):
        if not in_dygraph_mode():
            _logger.error("NOT support static graph")

        self.cur_config = {
            'kernel_size': kernel_size,
            'expand_ratio': expand_ratio,
            'channel': channel
        }
        in_nc = int(input.shape[1])
        assert (
            expand_ratio == None or channel == None
        ), "expand_ratio and channel CANNOT be NOT None at the same time."
        if expand_ratio != None:
            out_nc = int(expand_ratio * self.base_channel)
        elif channel != None:
            out_nc = int(channel)
        else:
            out_nc = self._num_filters

        ks = int(
            self._filter_size[0]) if kernel_size == None else int(kernel_size)

        groups, weight_in_nc, weight_out_nc = self.get_groups_in_out_nc(
            in_nc, out_nc)

        weight = self.get_active_filter(weight_in_nc, weight_out_nc, ks)
        if kernel_size != None or 'kernel_size' in self.candidate_config.keys(
        ):
            padding = convert_to_list(get_same_padding(ks), 2)
        else:
            padding = self._padding

        op = getattr(core.ops, self._op_type)
        out = op(input, weight, 'output_size', self._output_size, 'strides',
                 self._stride, 'paddings', padding, 'dilations',
                 self._dilation, 'groups', groups, 'use_cudnn',
                 self._use_cudnn)
        pre_bias = out
        out_nc = int(pre_bias.shape[1])
        if self.bias is not None:
            bias = self.bias[:out_nc]
            pre_act = dygraph_utils._append_bias_in_dygraph(pre_bias, bias, 1)
        else:
            pre_act = pre_bias

        return dygraph_utils._append_activation_in_dygraph(pre_act,
                                                           act=self._act)
Beispiel #6
0
    def forward(self, input):
        quant_input = self._fake_quant_input(input)
        quant_weight = self._fake_quant_weight(self.weight)

        if in_dygraph_mode() and self._l_type == 'conv2d':
            attrs = ('strides', self._stride, 'paddings', self._padding,
                     'dilations', self._dilation, 'groups',
                     self._groups if self._groups else 1, 'use_cudnn',
                     self._use_cudnn)
            pre_bias = core.ops.conv2d(quant_input, quant_weight, *attrs)

            pre_act = dygraph_utils._append_bias_in_dygraph(
                pre_bias, self.bias, 1)
            return dygraph_utils._append_activation_in_dygraph(
                pre_act, self._act)
        check_variable_and_dtype(quant_input, 'input',
                                 ['float16', 'float32', 'float64'],
                                 'QuantizedConv2D')
        attrs = {
            'strides': self._stride,
            'paddings': self._padding,
            'dilations': self._dilation,
            'groups': self._groups if self._groups else 1,
            'use_cudnn': self._use_cudnn,
            'use_mkldnn': False,
        }
        pre_bias = self._helper.create_variable_for_type_inference(
            dtype=self._dtype)

        self._helper.append_op(type=self._l_type,
                               inputs={
                                   'Input': quant_input,
                                   'Filter': quant_weight,
                               },
                               outputs={"Output": pre_bias},
                               attrs=attrs)

        if self.bias is not None:
            pre_act = self._helper.create_variable_for_type_inference(
                dtype=self._dtype)
            self._helper.append_op(type='elementwise_add',
                                   inputs={
                                       'X': [pre_bias],
                                       'Y': [self.bias]
                                   },
                                   outputs={'Out': [pre_act]},
                                   attrs={'axis': 1})
        else:
            pre_act = pre_bias

        return self._helper.append_activation(pre_act, act=self._act)
Beispiel #7
0
    def forward(self, input):
        input_shape = list(input.shape)
        input_ndim = len(input_shape)
        normalized_ndim = len(self._normalized_shape)
        self._begin_norm_axis = input_ndim - normalized_ndim

        ### TODO(ceci3): fix if normalized_shape is not a single number
        feature_dim = int(input.shape[-1])
        weight = self.weight[:feature_dim]
        bias = self.bias[:feature_dim]
        pre_act, _, _ = core.ops.layer_norm(input, weight, bias, 'epsilon',
                                            self._epsilon, 'begin_norm_axis',
                                            self._begin_norm_axis)
        return dygraph_utils._append_activation_in_dygraph(
            pre_act, act=self._act)
Beispiel #8
0
    def forward(self, input):
        quant_input = self._fake_quant_input(input)
        quant_weight = self._fake_quant_weight(self.weight)
        if in_dygraph_mode():
            pre_bias = _varbase_creator(dtype=input.dtype)
            core.ops.matmul(quant_input, quant_weight, pre_bias, 'transpose_X',
                            False, 'transpose_Y', False, "alpha", 1)
            pre_act = dygraph_utils._append_bias_in_dygraph(
                pre_bias, self.bias, axis=len(input.shape) - 1)

            return dygraph_utils._append_activation_in_dygraph(
                pre_act, self._act)

        check_variable_and_dtype(input, 'input',
                                 ['float16', 'float32', 'float64'],
                                 "QuantizedLinear")
        attrs = {
            "transpose_X": False,
            "transpose_Y": False,
            "alpha": 1,
        }
        inputs = {"X": [quant_input], "Y": [quant_weight]}
        mul_out = self._helper.create_variable_for_type_inference(self._dtype)

        self._helper.append_op(type="matmul",
                               inputs=inputs,
                               outputs={"Out": [mul_out]},
                               attrs=attrs)
        if self.bias is not None:
            pre_activation = self._helper.create_variable_for_type_inference(
                dtype=self._dtype)
            self._helper.append_op(type='elementwise_add',
                                   inputs={
                                       'X': [mul_out],
                                       'Y': [self.bias]
                                   },
                                   outputs={'Out': [pre_activation]},
                                   attrs={'axis': len(input.shape) - 1})
        else:
            pre_activation = mul_out
        return self._helper.append_activation(pre_activation, act=self._act)
Beispiel #9
0
    def forward(self, input):
        feature_dim = int(input.shape[1])

        weight = self.weight[:feature_dim]
        bias = self.bias[:feature_dim]
        mean = self._mean[:feature_dim]
        variance = self._variance[:feature_dim]

        mean_out = self._mean
        variance_out = self._variance
        mean_out_tmp = mean
        variance_out_tmp = variance

        attrs = ("momentum", self._momentum, "epsilon", self._epsilon,
                 "is_test", not self.training, "data_layout",
                 self._data_layout, "use_mkldnn", False, "fuse_with_relu",
                 self._fuse_with_relu, "use_global_stats",
                 self._use_global_stats, 'trainable_statistics',
                 self._trainable_statistics)

        if feature_dim != self._mean.shape[0]:
            batch_norm_out = core.ops.batch_norm(input, weight, bias, mean,
                                                 variance, mean_out_tmp,
                                                 variance_out_tmp, *attrs)
            self._mean[:feature_dim] = mean
            self._variance[:feature_dim] = variance
            mean_out[:feature_dim] = mean_out_tmp
            variance_out[:feature_dim] = variance_out_tmp
        else:
            batch_norm_out = core.ops.batch_norm(input, weight, bias,
                                                 self._mean, self._variance,
                                                 mean_out, variance_out,
                                                 *attrs)

        return dygraph_utils._append_activation_in_dygraph(batch_norm_out[0],
                                                           act=self._act)
Beispiel #10
0
    def forward(self, input):
        feature_dim = int(input.shape[1])

        weight = self.weight[:feature_dim]
        bias = self.bias[:feature_dim]
        mean = self._mean[:feature_dim]
        variance = self._variance[:feature_dim]

        mean_out = self._mean
        variance_out = self._variance
        mean_out_tmp = mean
        variance_out_tmp = variance

        attrs = ("momentum", self._momentum, "epsilon", self._epsilon,
                 "is_test", not self.training, "data_layout", self._data_layout,
                 "use_mkldnn", False, "fuse_with_relu", self._fuse_with_relu,
                 "use_global_stats", self._use_global_stats,
                 'trainable_statistics', self._trainable_statistics)
        try:
            from paddle import _C_ops
            from paddle.fluid.framework import in_dygraph_mode, _in_legacy_dygraph
            if in_dygraph_mode():
                if feature_dim != self._mean.shape[0]:
                    batch_norm_out = _C_ops.final_state_batch_norm(
                        input, weight, bias, mean, variance, mean_out_tmp,
                        variance_out_tmp, *attrs)
                    self._mean[:feature_dim] = mean
                    self._variance[:feature_dim] = variance
                    mean_out[:feature_dim] = mean_out_tmp
                    variance_out[:feature_dim] = variance_out_tmp
                else:
                    batch_norm_out = core.ops.batch_norm(
                        input, weight, bias, self._mean, self._variance,
                        mean_out, variance_out, *attrs)
            elif _in_legacy_dygraph():
                if feature_dim != self._mean.shape[0]:
                    batch_norm_out = core.ops.batch_norm(
                        input, weight, bias, mean, variance, None, mean_out_tmp,
                        variance_out_tmp, *attrs)
                    self._mean[:feature_dim].set_value(mean)
                    self._variance[:feature_dim].set_value(variance)
                    mean_out[:feature_dim].set_value(mean_out_tmp)
                    variance_out[:feature_dim].set_value(variance_out_tmp)
                else:
                    batch_norm_out = core.ops.batch_norm(
                        input, weight, bias, self._mean, self._variance, None,
                        mean_out, variance_out, *attrs)
        except:
            if feature_dim != self._mean.shape[0]:
                batch_norm_out = core.ops.batch_norm(input, weight, bias, mean,
                                                     variance, mean_out_tmp,
                                                     variance_out_tmp, *attrs)
                self._mean[:feature_dim].set_value(mean)
                self._variance[:feature_dim].set_value(variance)
                mean_out[:feature_dim].set_value(mean_out_tmp)
                variance_out[:feature_dim].set_value(variance_out_tmp)
            else:
                batch_norm_out = core.ops.batch_norm(
                    input, weight, bias, self._mean, self._variance, mean_out,
                    variance_out, *attrs)

        return dygraph_utils._append_activation_in_dygraph(
            batch_norm_out[0], act=self._act)
Beispiel #11
0
    def forward(self, input, expand_ratio=None, channel=None):
        self.cur_config = {'expand_ratio': expand_ratio, 'channel': channel}
        in_nc = int(input.shape[1])
        assert (
            expand_ratio == None or channel == None
        ), "expand_ratio and channel CANNOT be NOT None at the same time."
        if expand_ratio != None:
            out_nc = int(expand_ratio * self.base_output_dim)
        elif channel != None:
            out_nc = int(channel)
        else:
            out_nc = self.conv[0]._num_filters

        weight = self.conv[0].weight[:in_nc]
        ###  conv1
        if self.conv[0]._l_type == 'conv2d':
            attrs = ('strides', self.conv[0]._stride, 'paddings',
                     self.conv[0]._padding, 'dilations', self.conv[0]._dilation,
                     'groups', in_nc, 'use_cudnn', self.conv[0]._use_cudnn)
            out = core.ops.conv2d(input, weight, *attrs)
        elif self.conv[0]._l_type == 'depthwise_conv2d':
            attrs = ('strides', self.conv[0]._stride, 'paddings',
                     self.conv[0]._padding, 'dilations', self.conv[0]._dilation,
                     'groups', in_nc, 'use_cudnn', self.conv[0]._use_cudnn)
            out = core.ops.depthwise_conv2d(input, weight, *attrs)
        else:
            raise ValueError("conv type error")

        pre_bias = out
        if self.conv[0].bias is not None:
            bias = self.conv[0].bias[:in_nc]
            pre_act = dygraph_utils._append_bias_in_dygraph(pre_bias, bias, 1)
        else:
            pre_act = pre_bias

        conv0_out = dygraph_utils._append_activation_in_dygraph(
            pre_act, self.conv[0]._act)

        norm_out = self.conv[1](conv0_out)

        weight = self.conv[2].weight[:out_nc, :in_nc, :, :]

        if self.conv[2]._l_type == 'conv2d':
            attrs = ('strides', self.conv[2]._stride, 'paddings',
                     self.conv[2]._padding, 'dilations', self.conv[2]._dilation,
                     'groups', self.conv[2]._groups if self.conv[2]._groups else
                     1, 'use_cudnn', self.conv[2]._use_cudnn)
            out = core.ops.conv2d(norm_out, weight, *attrs)
        elif self.conv[2]._l_type == 'depthwise_conv2d':
            attrs = ('strides', self.conv[2]._stride, 'paddings',
                     self.conv[2]._padding, 'dilations', self.conv[2]._dilation,
                     'groups', self.conv[2]._groups, 'use_cudnn',
                     self.conv[2]._use_cudnn)
            out = core.ops.depthwise_conv2d(norm_out, weight, *attrs)
        else:
            raise ValueError("conv type error")

        pre_bias = out
        if self.conv[2].bias is not None:
            bias = self.conv[2].bias[:out_nc]
            pre_act = dygraph_utils._append_bias_in_dygraph(pre_bias, bias, 1)
        else:
            pre_act = pre_bias

        conv1_out = dygraph_utils._append_activation_in_dygraph(
            pre_act, self.conv[2]._act)

        return conv1_out
    def forward(self, input, config):
        in_nc = int(input.shape[1])
        out_nc = config['channel']
        weight = self.weight[:out_nc, :in_nc, :, :]
        #print('super conv shape', weight.shape)
        if in_dygraph_mode():
            if self._l_type == 'conv2d':
                attrs = ('strides', self._stride, 'paddings', self._padding,
                         'dilations', self._dilation, 'groups',
                         self._groups if self._groups else 1, 'use_cudnn',
                         self._use_cudnn)
                out = core.ops.conv2d(input, weight, *attrs)
            elif self._l_type == 'depthwise_conv2d':
                attrs = ('strides', self._stride, 'paddings', self._padding,
                         'dilations', self._dilation, 'groups', self._groups,
                         'use_cudnn', self._use_cudnn)
                out = core.ops.depthwise_conv2d(input, weight, *attrs)
            else:
                raise ValueError("conv type error")

            pre_bias = out
            if self.bias is not None:
                bias = self.bias[:out_nc]
                pre_act = dygraph_utils._append_bias_in_dygraph(
                    pre_bias, bias, 1)
            else:
                pre_act = pre_bias

            return dygraph_utils._append_activation_in_dygraph(
                pre_act, self._act)

        inputs = {'Input': [input], 'Filter': [weight]}
        attrs = {
            'strides': self._stride,
            'paddings': self._padding,
            'dilations': self._dilation,
            'groups': self._groups if self._groups else 1,
            'use_cudnn': self._use_cudnn,
            'use_mkldnn': False,
        }
        check_variable_and_dtype(input, 'input',
                                 ['float16', 'float32', 'float64'],
                                 'SuperConv2D')
        pre_bias = self._helper.create_variable_for_type_inference(
            dtype=self._dtype)

        self._helper.append_op(type=self._l_type,
                               inputs={
                                   'Input': input,
                                   'Filter': weight,
                               },
                               outputs={"Output": pre_bias},
                               attrs=attrs)

        if self.bias is not None:
            bias = self.bias[:out_nc]
            pre_act = self._helper.create_variable_for_type_inference(
                dtype=self._dtype)
            self._helper.append_op(type='elementwise_add',
                                   inputs={
                                       'X': [pre_bias],
                                       'Y': [bias]
                                   },
                                   outputs={'Out': [pre_act]},
                                   attrs={'axis': 1})
        else:
            pre_act = pre_bias

        # Currently, we don't support inplace in dygraph mode
        return self._helper.append_activation(pre_act, act=self._act)
    def forward(self, input, config):
        in_nc = int(input.shape[1])
        out_nc = int(config['channel'])
        weight = self.conv[0].weight[:in_nc]
        ###  conv1
        if in_dygraph_mode():
            if self.conv[0]._l_type == 'conv2d':
                attrs = ('strides', self.conv[0]._stride, 'paddings',
                         self.conv[0]._padding, 'dilations',
                         self.conv[0]._dilation, 'groups', in_nc, 'use_cudnn',
                         self.conv[0]._use_cudnn)
                out = core.ops.conv2d(input, weight, *attrs)
            elif self.conv[0]._l_type == 'depthwise_conv2d':
                attrs = ('strides', self.conv[0]._stride, 'paddings',
                         self.conv[0]._padding, 'dilations',
                         self.conv[0]._dilation, 'groups', in_nc, 'use_cudnn',
                         self.conv[0]._use_cudnn)
                out = core.ops.depthwise_conv2d(input, weight, *attrs)
            else:
                raise ValueError("conv type error")

            pre_bias = out
            if self.conv[0].bias is not None:
                bias = self.conv[0].bias[:in_nc]
                pre_act = dygraph_utils._append_bias_in_dygraph(
                    pre_bias, bias, 1)
            else:
                pre_act = pre_bias

            conv0_out = dygraph_utils._append_activation_in_dygraph(
                pre_act, self.conv[0]._act)

        norm_out = self.conv[1](conv0_out)

        weight = self.conv[2].weight[:out_nc, :in_nc, :, :]

        if in_dygraph_mode():
            if self.conv[2]._l_type == 'conv2d':
                attrs = ('strides', self.conv[2]._stride, 'paddings',
                         self.conv[2]._padding, 'dilations',
                         self.conv[2]._dilation, 'groups',
                         self.conv[2]._groups if self.conv[2]._groups else 1,
                         'use_cudnn', self.conv[2]._use_cudnn)
                out = core.ops.conv2d(norm_out, weight, *attrs)
            elif self.conv[2]._l_type == 'depthwise_conv2d':
                attrs = ('strides', self.conv[2]._stride, 'paddings',
                         self.conv[2]._padding, 'dilations',
                         self.conv[2]._dilation, 'groups',
                         self.conv[2]._groups, 'use_cudnn',
                         self.conv[2]._use_cudnn)
                out = core.ops.depthwise_conv2d(norm_out, weight, *attrs)
            else:
                raise ValueError("conv type error")

            pre_bias = out
            if self.conv[2].bias is not None:
                bias = self.conv[2].bias[:out_nc]
                pre_act = dygraph_utils._append_bias_in_dygraph(
                    pre_bias, bias, 1)
            else:
                pre_act = pre_bias

            conv1_out = dygraph_utils._append_activation_in_dygraph(
                pre_act, self.conv[2]._act)
        return conv1_out
Beispiel #14
0
def FConv2D(input,
           weight,
           bias=None,
           padding=0,
           stride=1,
           dilation=1,
           groups=1,
           use_cudnn=True,
           act=None,
           data_format="NCHW",
           name=None):
    # entry checks
    if not isinstance(use_cudnn, bool):
        raise ValueError("Attr(use_cudnn) should be True or False. "
                         "Received Attr(use_cudnn): {}.".format(use_cudnn))
    if data_format not in ["NCHW", "NHWC"]:
        raise ValueError("Attr(data_format) should be 'NCHW' or 'NHWC'. "
                         "Received Attr(data_format): {}.".format(data_format))

    channel_last = (data_format == "NHWC")
    channel_dim = -1 if channel_last else 1
    num_channels = input.shape[channel_dim]
    num_filters = weight.shape[0]
    if num_channels < 0:
        raise ValueError("The channel dimmention of the input({}) "
                         "should be defined. Received: {}.".format(
                             input.shape, num_channels))
    if num_channels % groups != 0:
        raise ValueError(
            "the channel of input must be divisible by groups,"
            "received: the channel of input is {}, the shape of input is {}"
            ", the groups is {}".format(num_channels, input.shape, groups))
    if num_filters % groups != 0:
        raise ValueError(
            "the number of filters must be divisible by groups,"
            "received: the number of filters is {}, the shape of weight is {}"
            ", the groups is {}".format(num_filters, weight.shape, groups))

    # update attrs
    padding, padding_algorithm = _update_padding_nd(padding, channel_last, 2)
    stride = utils.convert_to_list(stride, 2, 'stride')
    dilation = utils.convert_to_list(dilation, 2, 'dilation')

    l_type = "conv2d"
    if (num_channels == groups and num_filters % num_channels == 0 and
            not use_cudnn):
        l_type = 'depthwise_conv2d'

    inputs = {'Input': [input], 'Filter': [weight]}
    attrs = {
        'strides': stride,
        'paddings': padding,
        'dilations': dilation,
        'groups': groups,
        'use_cudnn': use_cudnn,
        'use_mkldnn': False,
        'fuse_relu_before_depthwise_conv': False,
        "padding_algorithm": padding_algorithm,
        "data_format": data_format
    }

    if in_dygraph_mode():
        attrs = ('strides', stride, 'paddings', padding, 'dilations', dilation,
                 'groups', groups, 'use_cudnn', use_cudnn, 'use_mkldnn', False,
                 'fuse_relu_before_depthwise_conv', False, "padding_algorithm",
                 padding_algorithm, "data_format", data_format)
        pre_bias = getattr(core.ops, l_type)(input, weight, *attrs)
        if bias is not None:
            pre_act = nn.elementwise_add(pre_bias, bias, axis=channel_dim)
        else:
            pre_act = pre_bias
        out = dygraph_utils._append_activation_in_dygraph(
            pre_act, act, use_cudnn=use_cudnn)
    else:
        inputs = {'Input': [input], 'Filter': [weight]}
        attrs = {
            'strides': stride,
            'paddings': padding,
            'dilations': dilation,
            'groups': groups,
            'use_cudnn': use_cudnn,
            'use_mkldnn': False,
            'fuse_relu_before_depthwise_conv': False,
            "padding_algorithm": padding_algorithm,
            "data_format": data_format
        }
        check_variable_and_dtype(input, 'input',
                                 ['float16', 'float32', 'float64'], 'conv2d')
        helper = LayerHelper(l_type, **locals())
        dtype = helper.input_dtype()
        pre_bias = helper.create_variable_for_type_inference(dtype)
        outputs = {"Output": [pre_bias]}
        helper.append_op(
            type=l_type, inputs=inputs, outputs=outputs, attrs=attrs)
        if bias is not None:
            pre_act = nn.elementwise_add(pre_bias, bias, axis=channel_dim)
        else:
            pre_act = pre_bias
        out = helper.append_activation(pre_act)
    return out