Выпадение между двумя слоями Conv и Batchnormalization - PullRequest
0 голосов
/ 23 июня 2018
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 не вызывает затруднений.

BatchNorm

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

Третий столбец - количество параметров слоя. Для слоя batchnorm, нормализуем ли мы каждую карту объектов по всему пакету, чтобы для каждой карты объектов у нас было 4 параметра, и, таким образом, в моем случае у меня есть 32*4 = 128 параметры? Если я ошибаюсь, кто-нибудь может меня поправить Я предполагаю, что мое предположение неверно, поскольку я читаю где-то, что мы нормализуем по всему каналу. Но это не соответствует количеству параметров слоев.

1 Ответ

0 голосов
/ 24 июня 2018

Для слоя BatchNormalization, если вы внимательно прочитаете его исходный код doc / , его количество параметров зависит от следующих четырех параметров:

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

...