ValueError: Operands could not be broadcast together with shapes (54, 54, 128) (54, 54, 64)

ValueError: Operands could not be broadcast together with shapes (54, 54, 128) (54, 54, 64)

我写了一个包含三个卷积层的 ResNet 块:

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)

我认为问题出在 ResNet 块中的这一行:

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

输入数据与 x 的维度不同。但我不知道如何解决这个问题。 非常感谢您的帮助。

错误是由于添加了两个不同维度的张量 - (54, 54, 128) & (54, 54, 64).为了执行张量加法,输入维度必须沿所有轴相同。这是来自 Keras Add() doc 的相同注释:

Quote: "keras.layers.Add() ... 它将张量列表作为输入,所有形状相同,returns 单个张量(也是同样的形状)"

为了执行残差加法,您需要确保两个张量(一个沿着恒等路径,一个在残差路径)具有相同的维度。作为调试错误的简单解决方案,在最终的 Conv2D 中将 filters_last_layer 替换为 filters 以获得残差(x)和恒等张量(input_data)具有相同的形状 (54, 54, 64).

希望对您有所帮助! :)