keras合并连接失败,因为输入形状不同,即使输入形状相同

时间:2018-07-31 11:07:10

标签: python keras keras-layer

我试图将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)是另一个自定义keras层的输入张量形状,该层生成l1_conv_net,如下所示:

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), (None,7,62),(None,23,62),(None,2,62)]?为什么会这样?

谢谢!

3 个答案:

答案 0 :(得分:2)

所以...。如果消息表明您正在使用这些形状,则无法连接。...

[(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)以查看实际形状。 (顺便说一下,您发布的内容确实出了问题,因为张量的形状太怪异。如果使用一维卷积或RNN,则Keras形状很有意义)

如果您的后端不是张量流,则您的某个地方的自定义层或lambda层中的output_shape参数可能有误。

答案 1 :(得分:0)

Keras串联有一些限制。维数必须相同,这就是第一个张量失效的原因。您可以通过将其重塑为(None,1,62)来快速保存它。如果沿第一个轴合并,则所有“无”尺寸在计算中必须相同。看看source code,看来将轴设为None本身并不是问题。

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

答案 2 :(得分:0)

我不是专家,但是在我的情况下定义类似Input(shape =(1,1,)的输入,而不是Input(shape =(1,)),添加了所需的尺寸并合并为例外...只需尝试添加长度为1的尺寸即可。