Neural network ValueError:操作数无法与形状(54、54、128)(54、54、64)一起广播

Neural network ValueError:操作数无法与形状(54、54、128)(54、54、64)一起广播,neural-network,conv-neural-network,tensorflow2.0,tf.keras,resnet,Neural Network,Conv Neural Network,Tensorflow2.0,Tf.keras,Resnet,我编写了一个包含三个卷积层的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 = BatchNor

我编写了一个包含三个卷积层的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)。为了执行张量加法,输入尺寸沿所有轴必须相同。以下是同样的注释:

Quote:“
keras.layers.Add()
…它将所有相同形状的张量列表作为输入,并返回单个张量(同样具有相同形状)”

为了执行剩余加法,您需要确保两个张量(一个沿着标识路径,一个在剩余路径)具有相同的维度。作为调试错误的简单解决方案,在最终的
Conv2D
中,将
过滤器最后一层
替换为
过滤器
,以使残差(
x
)和身份张量(
输入数据
)具有相同的形状(54,54,64


希望这有帮助!:)

谢谢你的回答。我现在明白了。但另一个问题发生在我身上。我想添加额外的零来增加维数,这样我可以执行add()函数,但我不知道这是怎么发生的。哦,好的,所以你需要使用零张量来增加张量的维数。您可以使用tf.zeros()-获得指定维度的零张量&tf.concat()-将它们连接起来以获得增加维度的新张量。我是否正确理解了要求?是的,我想平衡尺寸。但我所做的和为我工作的是对输入数据应用1x1卷积。input_data=Conv2D(filters=F3,kernel_size=(1,1),padding='same',kernel_initializer=glorot_uniform(seed=0))(input_data)感谢您的帮助。