首页 > 解决方案 > 添加形状不匹配的层输出

问题描述

我正在尝试构建一个 V-Net,如Milletari 等人所述。,其中Add需要包含层。但是,由于该层的张量的形状Input在下Conv3D一层中被修改,该Add层报告ValueError为输出张量的形状不再匹配。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-Nets 的文章明确要求按元素求和。

其他用户已选择使用该merge()功能,但是,该功能已被弃用。

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

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

标签: pythonnumpytensorflowkeras

解决方案


文档

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

input和层的输出形状prelu必须相同。涂抹后conv形状input可能会发生变化,这就是为什么不能将两层添加在一起的原因。


推荐阅读