我试图将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)]?为什么会这样?
谢谢!
答案 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的尺寸即可。