Я пытаюсь построить свою собственную сеть ResNet 50 с остаточным типом модуля перед активацией (как это было выполнено в публикации He et al 2015 и 2016), мой первый этап: BN => CONV => BN =>ACT => POOL (max), который уменьшает тензор изображения с (1,224,224,1) до (1,56,56,64).на следующем этапе я пытаюсь сложить остаточный модуль с тремя блоками в конце модуля, необходимо выполнить операцию добавления между ярлыком и основным путем, но, похоже, между ними есть несовместимость.
K.clear_session()
# the input tensor
X_input = Input(shape=(224,224,1))
# stage 1: input => BN => CONV => BN => ACT => POOL(max)
bn1_1 = BatchNormalization(epsilon=2e-5,momentum=0.9)(X_input)
conv1_1 = Conv2D(filters=64, kernel_size=(7,7), strides=(2,2), padding='same')(bn1_1)
bn1_2 = BatchNormalization(epsilon=2e-5,momentum=0.9)(conv1_1)
act1_1 = Activation('relu')(bn1_2)
pool1_1 = MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same')(act1_1)
# tensor shape after stage 1 is (1, 56, 56, 64)
# first residual module
# copy the input
X_shortcut = pool1_1
# get the filters size
f1,f2,f3 = [64,64,256]
bnEps = 2e-5
bnMom = 0.9
# first block
bn1 = BatchNormalization(epsilon=bnEps, momentum=bnMom)(pool1_1)
act1 = Activation('relu')(bn1)
conv1 = Conv2D(filters=f1, kernel_size=(1,1), strides=(1,1), padding='valid')(act1)
# second block
bn2 = BatchNormalization(epsilon=bnEps, momentum=bnMom)(conv1)
act2 = Activation('relu')(bn2)
conv2 = Conv2D(filters=f2, kernel_size=(3,3), strides=(1,1), padding='same')(act2)
# third block
bn3 = BatchNormalization(epsilon=bnEps, momentum=bnMom)(conv2)
act3 = Activation('relu')(bn3)
conv3 = Conv2D(filters=f3, kernel_size=(1,1), strides=(1,1), padding='valid')(act3)
# addition
add = Add()([conv3,pool1_1])
# create a model
model = Model(inputs=X_input, outputs=conv3)
model.compile(optimizer='adam' ,loss='mse')
ошибка, которую я получаю:
ValueError: Невозможно передать операнды вместе с фигурами (56, 56, 256) (56, 56, 64)
Не знаюпонять, как подобрать форму между этими этапами: /