ValueError: Операнды не могут передаваться вместе с фигурами (54, 54, 128) (54, 54, 64) - PullRequest
1 голос
/ 07 февраля 2020

Я написал блок Re sNet с тремя сверточными слоями:

def res_net_block(input_data, filters, kernel_size):
kernel_middle = kernel_size + 2
filters_last_layer = filters * 2

x = Conv2D(filters, kernel_size, activation = 'relu', padding = 'same')(input_data)   #64, 1x1 
x = BatchNormalization()(x)

x = Conv2D(filters, kernel_middle, activation = 'relu', padding = 'same')(x)          #64, 3x3
x = BatchNormalization()(x)

x = Conv2D(filters_last_layer, kernel_size, activation = None, padding = 'same')(x)   #128, 1x1 
x = BatchNormalization()(x)

x = Add()([x, input_data])

x = Activation('relu')(x)
return x

Когда я добавляю его в свою модель, я получаю эту ошибку: ValueError: Операнды не могут передаваться вместе с фигурами (54 , 54, 128) (54, 54, 64)

Вот моя модель на данный момент:

inputs = Input(shape = (224, 224, 3))
model = Conv2D(filters = 64, kernel_size = 7, strides = 2, activation = 'relu')(inputs)
model = BatchNormalization()(model)
model = MaxPool2D(pool_size = 3, strides = 2)(model)
for i in range(num_res_net_blocks):
    model = res_net_block(model, 64, 1)

Я считаю, что проблема связана с этой строкой в ​​блоке Re sNet:

x = Add()([x, input_data])

Входные данные имеют размеры, отличные от x. Но я не знаю, как решить эту проблему. Буду очень признателен за помощь.

1 Ответ

1 голос
/ 07 февраля 2020

Ошибка связана с добавлением двух тензоров с разными размерами - (54, 54, 128 ) & (54, 54, 64 ). Чтобы выполнить сложение тензора, входные размеры должны быть одинаковыми по всем осям . Вот то же примечание от Keras Add () do c:

Цитата: "keras.layers.Add() ... Он принимает в качестве входных данных список тензоров, всех той же формы и возвращает один тензор (также той же формы) "

Чтобы выполнить остаточное сложение, необходимо обеспечить два тензора - один вдоль пути тождества и один на остаточном пути, имеют одинаковые размеры. В качестве простого решения для устранения ошибки, в конечном итоге Conv2D замените filters_last_layer на filters, чтобы получить как остаточный (x), так и тензор тождества (input_data), чтобы иметь одинаковую форму (54, 54, 64 ).

Надеюсь, это поможет! :)

...