添加形状不匹配的图层输出

时间:2019-11-18 15:02:02

标签: python numpy tensorflow keras

我正在按照Milletari et al.所述构建V-Net,其中需要包括Add层。但是,由于在接下来的Input层中修改了Conv3D层的张量的形状,因此Add层报告了ValueError,因为输出张量的形状为no更长的比赛。 Add要求这些形状必须相同。

就我而言:

ValueError: Operands could not be broadcast together with shapes (3, 87, 512, 512) (16, 87, 512, 512)

不幸的是,Add层具有足够通用的术语,因此在线搜索不会返回相关的匹配。

示例代码:

# Assume imports are present

# Down Block 1
input_layer = Input(input_shape)
conv_1_1 = Conv3D(filters=16, kernel_size=(5, 5, 5), padding="same")(input_layer)
prelu_1_1 = PReLU()(conv_1_1)
add_1_1 = Add()([input_layer, prelu_1_1])
conv_1_2 = Conv3D(filters=16, kernel_size=(2, 2, 2), strides=(2, 2, 2)(add_1_1)
prelu_1_2 = PReLU()(conv_1_2)

# Down Block 2
# ...

keras.backend.tile应用于错误的尺寸,并且keras.backend.expand_dims仅添加了其他轴,而没有增加一个。 keras.layers.Reshape失败,因为新形状没有相同数量的元素。 Concatenate层可以工作,但是,有关V-Net的文章明确要求按元素求和。

其他用户选择使用merge()功能,但是不建议使用此功能。

我想找到一种方法来增大input_layer张量以匹配prelu_1_1层的形状,或者找到一种函数让我对不匹配的张量求和。

不幸的是,我无法从提到的文章中找到任何源代码,而且我发现的所有实现似乎都不能清楚地解决我的问题。

1 个答案:

答案 0 :(得分:0)

来自docs

  

它将所有相同形状的张量列表作为输入,并返回单个张量(也具有相同形状)。

inputprelu层的输出形状必须相同。在conv上应用input之后,形状可能已经改变,这就是为什么不能将两个图层都加在一起的原因。