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参数?如果我错了,有人可以纠正我。我认为我的假设是错误的,因为我在某个地方阅读了我们在整个渠道进行归一化的内容。但这并不能算出层的参数数量。

最佳答案

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

10-08 18:36