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
个参数?如果我错了,有人可以纠正我。我认为我的假设是错误的,因为我在某个地方阅读了我们跨渠道标准化的内容。但这并不能算出层的参数数量。
答案 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_mean
和moving_variance
是不可训练的。
对于Dropout
层的使用,我认为在拥有基线模型之前,您不必担心它。有了基线模型后,可以通过添加额外的辍学图层来对其进行改进。当然,辍学率应该取决于您的任务,并且您可能必须尝试不同的比率才能看到哪个最有效。