【问题标题】:Tensorflow: Slice data and apply Convolution to each sliceTensorflow:切片数据并将卷积应用于每个切片
【发布时间】: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


【解决方案1】:

如果 Keras TimeDistributed 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 中轻松实现。

【讨论】:

  • 请阅读完整的问题,提问者表示他知道 Keras 中的 TimeDistributed Layer,并想知道纯 tensorflow 的替代方案。
猜你喜欢
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2019-01-29
  • 2014-09-19
  • 2021-06-28
  • 2019-02-16
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多