我有一个3D卷的输入数据,并且想要将ConvNet应用于每个切片。Tensorflow:切片数据并将卷积应用到每个切片
这是个重复的问题。可悲的是没有回答: How to slice a batch and apply an operation on each slice in TensorFlow
在凯拉斯我会用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在重塑。我试图在元组中添加None
。这产生了另一个错误信息:
TypeError: Expected int32, got None of type '_Message' instead.
这是正确的方法吗? 我应该自己处理这个吗?
代码顶部的tf.split指定要分割的批次维度,但它看起来像要在大小为40的一个维上进行分割。 'tf.split(1,40,x)]'''slice = [tf.squeeze(sliced,squeeze_dims = [1])''''''''''''''这给了我一个40(?,40,40,1)张量表的清单。顺便说一句,你可以通过使用'tf.shape'将形状作为张量来重塑某些东西,但保留一个或多个未知维度。 –