【问题标题】:ValueError: Operands could not be broadcast together with shapes (54, 54, 128) (54, 54, 64)ValueError: 操作数不能与形状一起广播 (54, 54, 128) (54, 54, 64)
【发布时间】:2020-05-23 01:29:18
【问题描述】:

我写了一个包含三个卷积层的 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: Operands could not be broadcast together with shapes (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 不同。但我不知道如何解决这个问题。 我真的很感谢这里的一些帮助。

【问题讨论】:

    标签: neural-network conv-neural-network tensorflow2.0 tf.keras resnet


    【解决方案1】:

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

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

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

    希望这会有所帮助! :)

    【讨论】:

    • 感谢您的回答。我现在知道了。但另一个问题发生在我身上。我想添加额外的零来增加维度,所以我可以执行 Add() 函数,但我不知道这会如何发生。
    • 哦,好吧,所以你需要通过使用零张量来增加张量的维度。您可以使用 tf.zeros() - tensorflow.org/api_docs/python/tf/zeros 获得指定尺寸的零张量 & tf.concat() - tensorflow.org/api_docs/python/tf/concat 将它们连接起来以获得增加尺寸的新张量。我是否正确理解了要求?
    • 是的,我想平衡尺寸。但我所做和为我工作的是在 input_data 上应用 1x1 卷积。 input_data = Conv2D(filters=F3, kernel_size = (1, 1), padding = 'same', kernel_initializer = glorot_uniform(seed=0))(input_data) 谢谢你的帮助。
    猜你喜欢
    • 2016-10-31
    • 2018-10-05
    • 2020-07-29
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多