python - 添加形状不匹配的层输出
问题描述
我正在尝试构建一个 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
层的形状,或者找到一个让我对不匹配的张量求和的函数。
不幸的是,我无法从上述文章中找到任何源代码,而且我发现的所有实现似乎都无法清楚地解决我的问题。
解决方案
从文档:
它将一个张量列表作为输入,所有形状都相同,并返回一个张量(也具有相同的形状)。
input
和层的输出形状prelu
必须相同。涂抹后conv
形状input
可能会发生变化,这就是为什么不能将两层添加在一起的原因。
推荐阅读
- c++ - 我可以定义包含结构的类并且结构里面有这个类吗
- python - 如何在熊猫中使用矢量化而不是 for 循环
- angular - 标头身份验证值始终是我的应用程序的身份验证令牌,即使我将其设置为我要调用的 api 的访问令牌
- apache-nifi - Apache Nifi 使用 RouteText 搜索字符串数组
- cmake - 为什么 CMake Linux 二进制文件依赖于 libgtk3-noscd?
- windows - 无法将远程 git repo 从 cPanel 克隆到本地 PC
- javascript - 如何使用 sequelize 检查记录是否更新
- python - 是否可以将字典连接到空的 DataFrame?
- vue.js - Nuxt,Strapi 无法获取媒体网址
- azure - 将 itemname: "*" 更改为文件的父文件夹 [Azure 数据工厂]