【问题标题】:Tensorflow: analogue for numpy.take?Tensorflow:numpy.take 的类似物?
【发布时间】:2017-07-08 07:40:53
【问题描述】:

numpy.take 有类似物吗? 我想从N 维数组形成N+1 维数组,更准确地说是从形状为(B, H, W, C) 的数组我想制作(B, H, W, X, C) 数组。

我想对于我的情况,即使没有这样的一般操作,也有解决方案。但我真的不确定,如果我将编写具有多个中间操作和张量(移位、重复等)的代码,TF 是否能够对其进行优化并删除不必要的操作。此外,我认为这样的代码会不干净而且很糟糕。

我想添加具有移位值的维度。 IE。对于 (H,W)->(H,W,3) 维度,案例索引必须是

[
[[0,0], #[0,-1], may be padding with zeros but for now pad with edge value
[0,0],
[0,1]],

[[0,0],
[0,1]
[0,2]]
...
[[1,0],
 [1,0],
 [1,1]],

 [[1,0],
 [1,1],
 [1,2]],
...
]

我想过tf.scatter_nd (https://www.tensorflow.org/api_docs/python/tf/scatter_nd) 但现在我不明白如何使用它。如果我理解正确,我不能将indices 与形状大于update 数组的形状一起使用(即我不能将indices 与形状(3,4,5,3) 和update 与形状(3,4,3) 甚至@ 一起使用987654335@。如果是这样,那么这个操作似乎没用,直到我制作了需要在结果中形成的形状的中间数组。

UPD:可能是我错了,张量操作(移位、平铺等)是更合适和有效的解决方案。 但无论如何,我认为np.take 的类似物会很有用。

【问题讨论】:

  • 我不明白你的 np.take 类比。它只是沿一维索引 - 可以选择换行或剪裁。

标签: arrays numpy tensorflow


【解决方案1】:

tensorflow 中最接近np.take 的函数是tf.gather 和tf.gather_nd。

tf.gather_nd 比tf.gather(和np.take)更通用,因为它可以一次切割多个维度。

与np.take 相比,tf.gather[_nd] 的一个显着限制是它们仅对张量的第一个维度进行切片——您不能对内部维度进行切片。当您想对任意维度进行切片时(如您的情况),您需要转置数组以首先放置切片维度,收集,然后转回。

【讨论】:

  • 谢谢!我不确定我是否理解关于切片的声明。我只是构建没有切片的完整索引(使用 numpy)并使用该索引收集数据。似乎它有效,至少TF没有错误。将尝试对其进行测试。
  • 谢谢@P-Gn,我也遇到了同样的问题。并且找不到任何解决方案来通过内部维度索引分割 teensor。到目前为止,转置似乎是唯一的解决方案。
【解决方案2】:

tf.gather 替换 np.take 的示例代码:

import numpy as np

a = np.array([5, 7, 42])
b = np.random.randint(0, 3, (2, 3, 4))
c = a[b]
result_numpy = np.take(a, b)

print(a, b, c, result_numpy)

import tensorflow as tf

a = tf.convert_to_tensor(a)
b = tf.convert_to_tensor(b)
# c = a[b] # does not work
result_tf = tf.gather(a, b)

print(a, b, result_tf)

assert(np.array_equal(result_numpy, result_tf.numpy()))

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2012-01-17
    • 2011-04-16
    相关资源
    最近更新 更多