【问题标题】:keras merge concatenate failed because of different input shape even though input shape are the same即使输入形状相同,由于输入形状不同,keras 合并连接失败
【发布时间】:2019-01-07 18:22:12
【问题描述】:

我正在尝试将 4 个不同的层连接到一个层中,以输入到我的模型的下一部分。我正在使用 Keras 函数式 API,代码如下所示。

# Concat left side 4 inputs and right side 4 inputs
print(lc,l1_conv_net,l2_conv_net,l3_conv_net)
left_combined = merge.Concatenate()([lc, l1_conv_net, l2_conv_net, l3_conv_net])

发生此错误,表示我的输入形状不一样。但是,我还打印了输入形状,除了沿 concat 轴(这是 shape[1],因为 shape[0]=? 是批处理中的示例数)之外,它似乎是相同的。

Tensor("input_1:0", shape=(?, 6), dtype=float32) Tensor("add_3/add_1:0", shape=(?, 100), dtype=float32) Tensor("add_6/add_1:0", shape=(?, 100), dtype=float32) Tensor("add_9/add_1:0", shape=(?, 100), dtype=float32)

ValueError: A `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 6), (None, 7, 62), (None, 23, 62), (None, 2, 62)]

巧合的是,形状 (None, 7, 62), (None, 23, 62), (None, 2, 62) 是另一个生成 l1_conv_net 的自定义 keras 层的输入张量形状,如下所示:

l1_conv_net = build_graph_conv_net_fp_only([l1x, l1y, l1z],
                                                   conv_layer_sizes=self.conv_width,
                                                   fp_layer_size=self.fp_length,
                                                   conv_activation='relu', fp_activation='softmax')

所以打印语句说形状是 (?,6), (?,100) , (?,100) , (?,100) 但 keras 合并函数将其读取为 [(None, 6), (无, 7, 62), (无, 23, 62), (无, 2, 62)] ?为什么会这样?

谢谢!

【问题讨论】:

  • 你确定是同一个Concatenate层吗?似乎另一个具有不同输入的 concat 层导致错误,而不是您为其放置代码的错误。
  • 它是同一个 concat 层,因为我将行错误跟踪到该行:( 这很奇怪,因为该合并层之前的行显示形状都是一样的......
  • 即使打印显示不同的形状...使用print(K.int_shape(tensor)) 打印正确的形状。不要打印张量,keras 和 tensorflow 之间的对话可能有点扭曲。
  • 感谢您的帮助,我发现错误是因为自定义层使用的是 Keras1,它是 get_output_shape,而 Keras2 必须转换为 compute_output_shape。再次感谢您!

标签: python keras keras-layer


【解决方案1】:

所以....如果消息说您正在使用这些形状,那么您不能连接....

[(None, 6), (None, 7, 62), (None, 23, 62), (None, 2, 62)] 

你可以尝试连接最后三个:

left_combined = keras.layers.Concatenate(axis=1)([l1_conv_net, l2_conv_net, l3_conv_net])

不要打印张量,打印K.int_shape(tensor) 以查看实际形状。 (顺便说一句,您发布的内容确实有问题,因为张量的形状太奇怪了。如果您使用 1D 卷积或 RNN,Keras 形状是有意义的)

如果您的后端不是 tensorflow,则您可能在某处的自定义层或 lambda 层中有错误的 output_shape 参数。

【讨论】:

  • 你是对的。客户层 output_shape 方法错误。我将类层中的方法从 get_output_shape 更改为 compute_output_shape 并且一切都按预期出错!
  • 太棒了 :)) - 如果您认为这回答了您的问题,请将其标记为已回答。 @林凯卓
【解决方案2】:

Keras 连接有一些限制。维数必须相同,这就是你的第一个张量失败的原因。您可以通过将其重塑为 (None, 1, 62) 来快速保存它。如果您沿第一个轴合并,则所有 None 维度在计算中必须相同。查看source code,似乎将轴设置为 None 本身并不是问题。

因此,重塑第一个张量并检查 None 轴是否对于所有轴始终相同。

【讨论】:

    【解决方案3】:

    我不是一个大专家,但对于我的情况,定义像 Input(shape=(1,1,) 而不是这个 Input(shape=(1,)) 这样的输入,添加了所需的维度并合并是除外...只需尝试添加长度为 1 的维度。

    【讨论】:

      【解决方案4】:

      连接输出层或中间层的一个很好的解决方案是在连接之前将它们展平:

      l1_conv_net_features=Flatten(name="flatten_l1_conv_net")(l1_conv_net)
      l2_conv_net_features=Flatten(name="flatten_l2_conv_net")(l2_conv_net)
      l3_conv_net_features=Flatten(name="flatten_l3_conv_net")(l3_conv_net)
      all_features = concatenate([l1_conv_net_features, l2_conv_net_features,l3_conv_net_features])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 2018-02-16
        • 1970-01-01
        • 2019-10-29
        • 2020-06-10
        • 2017-08-14
        • 2018-11-21
        • 1970-01-01
        相关资源
        最近更新 更多