Уровень BatchNorm в Stage-1 моей ResNet связан со всеми другими уровнями BatchNorm.Зачем? - PullRequest
0 голосов
/ 12 июня 2018

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

Является ли оптимизация тензорного потока в бэкэнде?

Я реализовал код с использованием 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)

1 Ответ

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

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

...