由于输入形状不同,即使输入形状是sam,keras合并连接也失败

2024-05-21 13:50:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将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轴(这是形状[1],因为形状[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-u网:

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 merge函数将其读取为[(None,6),(None,7,62),(None,23,62),(None,2,62)]?为什么会这样?

谢谢你!


Tags: 函数noneaddlayerl1netleft形状
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,则路缘石形状是有意义的)

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

Keras连接有一些限制。维数必须相同,这就是第一个张量失败的原因。您可以通过将其重新整形为(None,162)来快速保存它。如果要沿第一个轴合并,则计算中所有“无”维度都必须相同。从source code来看,将轴设为None本身并不是问题。

因此,重塑第一个张量,并检查所有轴的“无轴”是否始终相同。

相关问题 更多 >