Tensorflow:切片数据并对每个切片应用卷积



我有一个3D的输入数据,我想对每个切片应用卷积神经网络。

这个问题有一个重复。悲伤地没有回答:如何在TensorFlow中对批处理进行切片并对每个切片应用操作

在Keras中,我会使用一个timedistributedlayer。在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.
这是正确的方法吗?我应该自己处理这个吗?

如果您需要Keras timedidistributed Layer,那么让我们看看它是如何实现的:

input_length = input_shape[1] # assume 2nd dim is the one to slice
# ...
# Shape: (num_samples * timesteps, ...)
inputs = K.reshape(inputs, (-1,) + input_shape[2:])
y = self.layer.call(inputs)  # (num_samples * timesteps, ...)
# Shape: (num_samples, timesteps, ...)
output_shape = self.compute_output_shape(input_shape)
y = K.reshape(y, (-1, input_length) + output_shape[2:])

基本思想是重塑张量,使第一维和第二维(批处理和切片维)折叠成一个。换句话说,每个"片"都可以被视为批处理中的一个附加数据点。然后将任何计算应用于这个新的虚拟批处理,并在最后重塑回原始形状。所有这些操作都可以在Tensorflow中轻松实现。

相关内容

  • 没有找到相关文章

最新更新