两个Conv层之间的辍学和Batchnormalization

时间:2018-06-23 14:12:20

标签: python tensorflow keras deep-learning dropout

model3=models.Sequential()
model3.add(Conv2D(32, 
(3,3),padding='same',kernel_regularizer=reg,input_shape=X_train.shape[1:]))
model3.add(BatchNormalization(axis=-1))
model3.add(Activation(activation='relu'))
model3.add(Dropout(0.2))
model3.add(Conv2D(32,(3,3),padding='same',kernel_regularizer=reg))
model3.add(BatchNormalization(axis=-1))
model3.add(Activation(activation='relu'))
model3.add(Dropout(0.2))

我想知道两个转换层之间的辍学如何工作。如果第L层中要素地图的尺寸​​为(m, n_h, n_w, n_c),且卷积为(f, f, n_c)的过滤器,我们是否会在n_c通道中随机关闭一些单位卷积之前的L层?不过,在MaxPool图层上进行删除很简单。

批处理标准

conv2d_1 (Conv2D)            (None, 32, 32, 32)        896       
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 32)        128       
________________________________________________________________

第三列是图层的参数数。对于batchnorm层,我们是否将批处理中的每个特征图进行归一化,以便对于每个特征图,我们将具有4个参数,因此在我的情况下,我具有32*4 = 128个参数?如果我错了,有人可以纠正我。我认为我的假设是错误的,因为我在某个地方阅读了我们跨渠道标准化的内容。但这并不能算出层的参数数量。

1 个答案:

答案 0 :(得分:1)

对于BatchNormalization层,如果您仔细阅读其doc / source code,则其参数数量取决于以下四个参数:

def build(self, input_shape):
    dim = input_shape[self.axis]
    if dim is None:
        raise ValueError('Axis ' + str(self.axis) + ' of '
                         'input tensor should have a defined dimension '
                         'but the layer received an input with shape ' +
                         str(input_shape) + '.')
    self.input_spec = InputSpec(ndim=len(input_shape),
                                axes={self.axis: dim})
    shape = (dim,)

    if self.scale:
        self.gamma = self.add_weight(shape=shape,
                                     name='gamma',
                                     initializer=self.gamma_initializer,
                                     regularizer=self.gamma_regularizer,
                                     constraint=self.gamma_constraint)
    else:
        self.gamma = None
    if self.center:
        self.beta = self.add_weight(shape=shape,
                                    name='beta',
                                    initializer=self.beta_initializer,
                                    regularizer=self.beta_regularizer,
                                    constraint=self.beta_constraint)
    else:
        self.beta = None
    self.moving_mean = self.add_weight(
        shape=shape,
        name='moving_mean',
        initializer=self.moving_mean_initializer,
        trainable=False)
    self.moving_variance = self.add_weight(
        shape=shape,
        name='moving_variance',
        initializer=self.moving_variance_initializer,
        trainable=False)
    self.built = True

其中每个变量的形状为(dim,),在您的情况下为32。由于有四个变量,因此参数总数为32x4=128。但是,后面的两个moving_meanmoving_variance是不可训练的。

对于Dropout层的使用,我认为在拥有基线模型之前,您不必担心它。有了基线模型后,可以通过添加额外的辍学图层来对其进行改进。当然,辍学率应该取决于您的任务,并且您可能必须尝试不同的比率才能看到哪个最有效。