|
|
|
@@ -419,8 +419,11 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
padding (int): Implicit paddings on both sides of the input. Default: 0. |
|
|
|
eps (float): Parameters for BatchNormal. Default: 1e-5. |
|
|
|
momentum (float): Parameters for BatchNormal op. Default: 0.997. |
|
|
|
has_bias (bool): Specifies whether the layer uses a bias vector. Default: False. |
|
|
|
weight_init (Union[Tensor, str, Initializer, numbers.Number]): Initializer for the |
|
|
|
convolution kernel. Default: 'normal'. |
|
|
|
bias_init (Union[Tensor, str, Initializer, numbers.Number]): Initializer for the |
|
|
|
bias vector. Default: 'zeros'. |
|
|
|
beta_init (Union[Tensor, str, Initializer, numbers.Number]): Initializer for the |
|
|
|
beta vector. Default: 'zeros'. |
|
|
|
gamma_init (Union[Tensor, str, Initializer, numbers.Number]): Initializer for the |
|
|
|
@@ -460,7 +463,9 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
group=1, |
|
|
|
eps=1e-5, |
|
|
|
momentum=0.997, |
|
|
|
has_bias=False, |
|
|
|
weight_init='normal', |
|
|
|
bias_init='zeros', |
|
|
|
beta_init='zeros', |
|
|
|
gamma_init='ones', |
|
|
|
mean_init='zeros', |
|
|
|
@@ -484,6 +489,7 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
self.group = group |
|
|
|
self.eps = eps |
|
|
|
self.momentum = momentum |
|
|
|
self.has_bias = has_bias |
|
|
|
self.quant_delay = quant_delay |
|
|
|
self.freeze_bn = freeze_bn |
|
|
|
self.fake = fake |
|
|
|
@@ -516,6 +522,11 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
weight_shape = [out_channels, in_channels // group, *self.kernel_size] |
|
|
|
channel_axis = 0 |
|
|
|
self.weight = Parameter(initializer(weight_init, weight_shape), name='weight') |
|
|
|
self.bias_add = P.BiasAdd() |
|
|
|
if check_bool(has_bias): |
|
|
|
self.bias = Parameter(initializer(bias_init, [out_channels]), name='bias') |
|
|
|
else: |
|
|
|
self.bias = None |
|
|
|
|
|
|
|
# initialize BatchNorm Parameter |
|
|
|
self.gamma = Parameter(initializer(gamma_init, [out_channels]), name='gamma') |
|
|
|
@@ -562,6 +573,8 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
|
|
|
|
def construct(self, x): |
|
|
|
out_conv = self.conv(x, self.weight) |
|
|
|
if self.has_bias: |
|
|
|
out_conv = self.bias_add(out_conv, self.bias) |
|
|
|
# BN fold1 |
|
|
|
batch_mean, batch_std, running_mean, running_std = self.batchnorm_fold(out_conv, |
|
|
|
self.moving_mean, |
|
|
|
@@ -572,6 +585,8 @@ class Conv2dBnFoldQuant(Cell): |
|
|
|
if self.fake: |
|
|
|
weight = self.fake_quant_weight(weight) |
|
|
|
out = self.conv(x, weight) |
|
|
|
if self.has_bias: |
|
|
|
out = self.bias_add(out, self.bias) |
|
|
|
# BN fold2 |
|
|
|
if self.is_gpu: |
|
|
|
if self.training: |
|
|
|
|