【发布时间】:2017-03-17 01:41:03
【问题描述】:
我有一个 3D 量的输入数据,想对每个切片应用一个 ConvNet。
这个问题有一个重复。遗憾的是没有答案: How to slice a batch and apply an operation on each slice in TensorFlow
在 Keras 中,我会使用 TimeDistributed 层。 在 Tensorflow 中,我找不到直接的等价物。 相反,我觉得我必须自己对数据进行切片。
这是我目前的代码:
x=tf.placeholder(tf.float32, shape=[None, 40, 40, 40, 1])
slices=tf.split(0,40, x)
segmented_slices=[]
for slice in slices:
# apply a ConvNet to each slice
reshaped=tf.reshape(slice, (40, 40, 1)) #<-------second error
# reshaped=tf.reshape(slice, (None, 40, 40, 1)) #<-------third error
# segmented_slice=conv2d(slice, 3,1,32) #<-------first error
segmented_slice=conv2d(reshaped, 3,1,32)
segmented_slice=conv2d(segmented_slice, 3,32,32)
#... (more convolutions)
segmented_slices.append(segmented_slice)
volume=tf.concat(0, segmented_slices)
基本布局是split -> ConvNet -> concat。
但是split 保留了维度。如果我只是将slice 传递给卷积,它会抱怨:
ValueError: Shape (?, 40, 40, 40, 1) must have rank 4
因此我添加了一个重塑。这确实减少了维度的数量。但显然它也削减了batch_size。和第一个错误信息相比,问号和前40个都没有了。
ValueError: Shape (40, 40, 1) must have rank 4
看来我需要将 batch_size 保持在 reshape 中。我试图在元组中添加None。这会产生另一个错误消息:
TypeError: Expected int32, got None of type '_Message' instead.
这是正确的方法吗? 我应该自己处理吗?
【问题讨论】:
-
代码顶部的 tf.split 指定了要拆分的批次维度,但看起来您想在 size-40 维度之一上拆分。可能是
slices=[tf.squeeze(sliced, squeeze_dims=[1]) for sliced in tf.split(1,40, x)]之类的东西?这给了我一个包含 40 个 (?, 40, 40, 1) 张量的列表。顺便说一句,您可以通过使用tf.shape将形状作为张量来重塑某些东西,但保留一个或多个未知维度。
标签: python machine-learning tensorflow keras