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)
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
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)
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)
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)
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)
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)
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)
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)
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
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