Как исправить ошибку «Невозможно передать операнды вместе с фигурами (56, 56, 256) (56, 56, 64)» в моем ResNet50 - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь построить свою собственную сеть 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)

Не знаюпонять, как подобрать форму между этими этапами: /

...