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

我很想知道两个卷积层之间的 dropout 是如何工作的。L如果层中特征图的维度是(m, n_h, n_w, n_c),并且大小的过滤器(f, f, n_c)在其上进行卷积,我们是否在执行卷积之前随机关闭n_c层中通道中的一些单元L?MaxPool 层上的 Dropout 很简单。

批量标准

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

第三列是层的参数个数。对于 batchnorm 层,我们是否对批次中的每个特征图进行规范化,以便对于每个特征图我们将有 4 个参数,因此在我的情况下,我有32*4 = 128参数?如果我错了,有人可以纠正我。我假设我的假设是错误的,因为我在某个地方读到了我们在整个渠道中标准化的内容。但这并没有计算层的参数数量。

4

1 回答 1

1

对于BatchNormalizationlayer,如果你仔细阅读它的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

其中每个变量都是 shape (dim,),在你的情况下是 32 。由于有四个变量,所以参数总数为32x4=128。然而,后两者,即moving_meanmoving_variance不可训练。

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

于 2018-06-24T03:29:49.660 回答