Arrays Tensorflow:numpy.take的类似物?
有没有类似的Arrays Tensorflow:numpy.take的类似物?,arrays,numpy,tensorflow,Arrays,Numpy,Tensorflow,有没有类似的numpy.take? 我想从N-维数组中形成N+1-维数组,更精确地说,从具有形状的数组中形成(B,H,W,C)我想制作(B,H,W,X,C)数组 我想对于我的情况,即使没有这样的一般操作,也有解决办法。但我真的不确定,如果我编写带有多个中间操作和张量(移位、重复等)的代码,TF是否能够对其进行优化并删除不必要的操作。此外,我认为这样的代码将是不干净的,只是可怕的 我想添加带有移位值的维度。即,对于(H,W)->(H,W,3)维度,案例索引必须为 [ [[0,0], #[0,-1]
numpy.take
?
我想从N
-维数组中形成N+1
-维数组,更精确地说,从具有形状的数组中形成(B,H,W,C)
我想制作(B,H,W,X,C)
数组
我想对于我的情况,即使没有这样的一般操作,也有解决办法。但我真的不确定,如果我编写带有多个中间操作和张量(移位、重复等)的代码,TF是否能够对其进行优化并删除不必要的操作。此外,我认为这样的代码将是不干净的,只是可怕的
我想添加带有移位值的维度。即,对于(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(分散),但现在我不知道如何使用它。如果我理解正确,我不能将索引
用于大于更新
数组的形状(即,我不能将索引
用于形状(3,4,5,3)
和更新
用于形状(3,4,3)
甚至(3,4,1,3)
。如果是这样的话,那么这个操作似乎毫无用处,除非我用我需要在结果中形成的形状制作中间数组
UPD:可能是我错了,张量运算(移位、平铺等)是更合适、更有效的解决方案。
但在任何情况下,我认为对
np.take
的模拟都是有用的。tensorflow中与np.take
最接近的函数是and
tf.gather\nd
比tf.gather
(和np.take
)更一般,因为它可以一次分割多个维度
与
np.take
相比,tf.gather[\u nd]
的一个明显限制是,它们只对张量的第一个维度进行切片,而不能对内部维度进行切片。当您想要对任意维度进行切片时(如您的情况),您需要对数组进行转置,以首先放置切片维度,然后进行聚集,然后将其转置回原处。tensorflow中最接近的函数是np。take
是and
tf.gather\nd
比tf.gather
(和np.take
)更一般,因为它可以一次分割多个维度
与
np.take
相比,tf.gather[\u nd]
的一个明显限制是,它们只对张量的第一个维度进行切片,而不能对内部维度进行切片。当您想要对任意维度进行切片时(如您的情况),您需要转置数组以首先放置切片维度,然后聚集,然后再转置回去。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()))
tf.collect
替换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()))
谢谢!我不确定我是否理解关于切片的声明。我只是构建了没有切片的完整索引(使用numpy)并使用此索引收集数据。看起来它有效,至少TF没有错误。我将尝试测试它。谢谢,@P-Gn,我遇到了相同的问题。并且找不到任何解决方案来通过内部维度索引分割teensor。到目前为止,转置似乎是唯一的解决方案。谢谢!我不确定我是否理解关于切片。我只构建没有切片的完整索引(使用numpy)并使用此索引收集数据。似乎它有效,至少TF没有错误。我将尝试测试它。谢谢,@P-Gn,我遇到了相同的问题。并且找不到任何解决方案来通过内部维度索引分割teensor。转置似乎是目前为止唯一的解决方案。我不理解你的
np。进行类比。它只是沿着一个维度建立索引,可以选择包装或剪裁。我不理解你的np。打个比方吧。它只是沿着一个维度建立索引,可以选择包装或剪裁。