【问题标题】:How to slice a rank 4 tensor in TensorFlow?如何在 TensorFlow 中对 4 级张量进行切片?
【发布时间】:2016-05-22 05:42:46
【问题描述】:

我正在尝试使用tf.slice() 运算符对四维张量进行切片,如下所示:

x_image = tf.reshape(x, [-1,28,28,1], name='Images_2D')
slice_im = tf.slice(x_image,[0,2,2],[1, 24, 24])

但是,当我尝试运行此代码时,出现以下异常:

raise ValueError("Shape %s must have rank %d" % (self, rank))

ValueError: Shape TensorShape([Dimension(None), Dimension(28), Dimension(28), Dimension(1)]) must have rank 3

如何切片这个张量?

【问题讨论】:

  • @mrry 感谢您让问题更准确。

标签: slice tensorflow


【解决方案1】:

tf.slice(input, begin, size) 运算符要求 beginsize 向量(定义要切片的子张量)具有与 input 中的维数相同的长度。因此,要对 4-D 张量进行切片,您必须传递一个由四个数字组成的向量(或列表)作为 tf.slice() 的第二个和第三个参数。

例如:

x_image = tf.reshape(x, [-1, 28, 28, 1], name='Images_2D')

slice_im = tf.slice(x_image, [0, 2, 2, 0], [1, 24, 24, 1])

# Or, using the indexing operator:
slice_im = x_image[0:1, 2:26, 2:26, :]

索引运算符稍微强大一些,因为它还可以降低输出的排名,如果为维度指定单个整数而不是范围:

slice_im = x_image[0:1, 2:26, 2:26, :]
print slice_im_2d.get_shape()  # ==> [1, 24, 24, 1]

slice_im_2d = x_image[0, 2:26, 2:26, 0]
print slice_im_2d.get_shape()  # ==> [24, 24]

【讨论】:

  • 有没有办法分割和维护None 维度?换句话说,tf.slice(x_image, [-1, 2, 2, 0], [1, 24, 24, 1])
  • 是的,您可以将 -1 作为 sizes 参数的元素之一传递给 tf.slice()。 TensorFlow 索引运算符最近已升级以支持更多 NumPy 样式的切片定义,因此您可能会发现以这种方式定义切片更容易(例如,它支持“未知”起始位置)。
  • 起始索引还是0不是问题吗?
  • 如果你这样做 tf.slice(x, [0, …], [-1, …]) 这将切片定义为包括 every 行,这与 NumPy 的切片语义不同。索引运算符 (x[0:-1, …]) 的意思是“选择所有行除了最后一行,就像在 NumPy 中一样。
猜你喜欢
  • 1970-01-01
  • 2018-11-07
  • 2018-02-24
  • 2017-06-02
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多