我想使用ConvNet分割图像数据。同一网络应接收不同(但非常相似)的数据,然后将输出合并。

这涉及一个技巧:我的数据是3D,我将其切成2D图像,然后通过TimeDistributed将其传递到ConvNet。

将相同的ConvNet用于图像非常重要,应该共享权重。
这是代码:

dim_x, dim_y, dim_z = 40, 40, 40

inputs = Input((1, dim_x, dim_y, dim_z))

# slice the volume along different axes
x_perm=Permute((2,1,3,4))(inputs)
y_perm=Permute((3,1,2,4))(inputs)
z_perm=Permute((4,1,2,3))(inputs)

#apply the segmentation to each layer and for each slice-direction
x_dist=TimeDistributed(convmodel)(x_perm)
y_dist=TimeDistributed(convmodel)(y_perm)
z_dist=TimeDistributed(convmodel)(z_perm)

# now undo the permutation
x_dist=Permute((2,1,3,4))(x_dist)
y_dist=Permute((2,3,1,4))(y_dist)
z_dist=Permute((2,3,4,1))(z_dist)

#now merge the predictions
segmentation=merge([x_dist, y_dist, z_dist], mode="concat")

temp_model=Model(input=inputs, output=segmentation)

temp_model.summary()


convnet模型具有约330万个参数。排列和TimeDistributed图层没有自己的参数。
因此,完整的模型应具有与convnet相同数量的参数。

它没有,它的参数多了3倍,大约为990万。

显然,权重是不共享的。
但这是way权重分配应该起作用的。

模型是否共享权重并错误地报告参数数量?
我是否需要更改设置以启用体重共享?

最佳答案

感谢Keras-Users Google小组,现在可以这样回答:https://groups.google.com/forum/#!topic/keras-users/P-BMpdyJfXI

诀窍是先创建细分层,然后将其应用于数据。
这是工作代码:

#apply the segmentation to each layer and for each slice-direction
time_dist=TimeDistributed(convmodel)

x_dist=time_dist(x_perm)
y_dist=time_dist(y_perm)
z_dist=time_dist(z_perm)

关于python - Keras:体重分享无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40398821/

10-12 16:42