Уровень BatchNorm на этапе 1 моей ResNet подключен ко всем остальным уровням BatchNorm. Почему?

Здесь я привел несколько скриншотов реализованной мной модели ResNet. Графики, созданные с помощью TensorBoard.

Это какая-то оптимизация, которую tenorflow делает в бэкэнде?

Я реализовал код с помощью Keras.

В модели два блока. IdentityBlock и ConvolutionalBlock. Добавление кода этих блоков вызывает проблему в StackOverflow (ваш пост - это в основном код)

В функции ResNet (def ResNet) я использовал BatchNormalization и дал ей имя bnl_stg-1, которому я передал только один ввод (X). Но по какой-то причине он подключается ко всем слоям BatchNorm в блоках идентификации и свертки, как показано на изображениях.

Вот код:

def ResNet(input_shape, features):

'''
Implements the ResNet50 Model
[Conv2D -> BatchNorm -> ReLU -> MaxPool2D] --> [ConvBlock -> IdentityBlock * 2] --> [ConvBlock -> IdentityBlock * 3] --> [AveragePool2D -> Flatten -> Dense -> Sigmoid]
'''   
X_input = Input(input_shape)

X = ZeroPadding2D((3, 3))(X_input)

# Stage 1
X = Conv2D(filters = 64, 
           kernel_size = (7, 7), 
           strides = (2, 2), 
           name = 'cnl_stg-1', 
           kernel_initializer = 'glorot_uniform')(X)

X = BatchNormalization(axis = 3, 
                       name = 'bnl_stg-1')(X)

X = Activation('relu')(X)

X = MaxPooling2D(pool_size=(3, 3), 
                 strides=(2, 2))(X)

# Stage 2
X = convolutional_block(X, f = 3, filters = [64, 64, 256], stage = 2, s = 1)
X = identity_block(X, 3, [64, 64, 256], stage=2, block=1)
X = identity_block(X, 3, [64, 64, 256], stage=2, block=2)

# Stage 3 
X = convolutional_block(X, f = 3, filters = [128, 128, 512], stage = 3, s = 2)
X = identity_block(X, 3, [128, 128, 512], stage = 3, block = 1)
X = identity_block(X, 3, [128, 128, 512], stage = 3, block = 2)
X = identity_block(X, 3, [128, 128, 512], stage = 3, block = 3)

#Final Stage
X = AveragePooling2D(pool_size = (2, 2),
                     strides = (2, 2))(X)
X = Flatten()(X)
X = Dense(features, activation='sigmoid', name='fc' + str(features), kernel_initializer = 'glorot_uniform')(X)

# Create model
model = Model(inputs = X_input, outputs = X, name='ResNet')

return model

Снимок графика

bnl-stg-1 (BatchNormLayer-Stage-1)


person Lenka    schedule 12.06.2018    source источник


Ответы (1)


Не стоит об этом беспокоиться. Поведение пакетной нормализации меняется между обучением и обучением, поэтому Керас добавляет логическую переменную для управления им (keras_learning_phase, если я хорошо помню). Поэтому все эти слои связаны. Вы могли ожидать аналогичного поведения со слоями Dropout.

person Daniel GL    schedule 12.06.2018
comment
Но почему поведение пакетной нормализации изменяется во время фазы тестирования и обучения? - person Lenka; 12.06.2018