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))
Мне интересно знать, как выкидываются работы между двумя conv-слоями. Если размеры карт функций в слое L
(m, n_h, n_w, n_c)
и фильтр размера (f, f, n_c)
свернуты на нем, мы случайным образом n_c
некоторые единицы по каналам n_c
в слое L
перед выполнением свертки? Однако исключение на уровне MaxPool является простым.
BatchNorm
conv2d_1 (Conv2D) (None, 32, 32, 32) 896
_________________________________________________________________
batch_normalization_1 (Batch (None, 32, 32, 32) 128
________________________________________________________________
Третий столбец - это количество параметров слоя. Для слоя batchnorm мы нормализуем каждую карту объектов по всей партии, так что для каждой карты функций у нас будет 4 параметра, и, таким образом, в моем случае у меня есть 32*4 = 128
параметров? Если я ошибаюсь, может кто-то меня исправить. Я предполагаю, что мое предположение неверно, поскольку я где-то читал, что мы нормализуемся по каналу. Но это не указывает количество параметров слоев.
Для уровня BatchNormalization
, если вы внимательно прочитали его документ /исходный код, его количество параметров зависит от следующих четырех параметров:
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
я не думаю, что вам нужно беспокоиться об этом, прежде чем у вас будет базовая модель. После того, как у вас есть базовая модель, вы можете улучшить ее, добавив дополнительные уровни отсева. Конечно, уровень отсева должен зависеть от вашей задачи, и вам, возможно, придется попробовать разные ставки, чтобы увидеть, какой из них лучше всего работает.