Выпадение между двумя слоями Conv и Batchnormalization

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

Мне интересно знать, как выкидываются работы между двумя 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 параметров? Если я ошибаюсь, может кто-то меня исправить. Я предполагаю, что мое предположение неверно, поскольку я где-то читал, что мы нормализуемся по каналу. Но это не указывает количество параметров слоев.

Теги:
tensorflow
keras
deep-learning
dropout

1 ответ

1

Для уровня 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 я не думаю, что вам нужно беспокоиться об этом, прежде чем у вас будет базовая модель. После того, как у вас есть базовая модель, вы можете улучшить ее, добавив дополнительные уровни отсева. Конечно, уровень отсева должен зависеть от вашей задачи, и вам, возможно, придется попробовать разные ставки, чтобы увидеть, какой из них лучше всего работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню