使用布尔张量的Tensorflow索引
python
tensorflow
4
0

在numpy中,使用具有相同形状的两个数组xy ,可以像y[x > 1]那样进行切片。如何在张量流中获得相同的结果? y[tf.greater(x, 1)]不起作用,并且tf.slice也不支持任何此类功能。现在有没有一种方法可以使用布尔张量进行索引,或者目前不支持该方法?

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃

目前尚未实现,这是跟踪进度的GitHub问题-https: //github.com/tensorflow/tensorflow/issues/206

收藏
评论

正在寻找类似的功能来按定义的标准减少TensorFlow.js张量,但是TensorFlow.js没有boolean_mask函数。经过大量的拔发和咬牙切齿的工作后,烹饪了以下内容,这些内容实际上汇总了真实标准的总数,然后简单地选择topk值来创建子集张量。

const a = tf.tensor1d([1, 2, 0, 4]);
const b = a.greater(1).sum().get();
const {values, indices} = tf.topk(a, b);
values.print();   # 4,2
indices.print();  # 3,1

要创建一个值小于或等于1的子集张量,只需在张量上使用tf.neg即可,因为没有bottomk函数,然后通过topk获取子集张量后,再次应用tf.neg进行恢复原始值。

收藏
评论

尝试:

ones = tf.ones_like(x) # create a tensor all ones
mask = tf.greater(x, ones) # boolean tensor, mask[i] = True iff x[i] > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)

tf.boolean_mask

编辑 :另一种(更好的?)方法:

import tensorflow as tf

x = tf.constant([1, 2, 0, 4])
y = tf.Variable([1, 2, 0, 4])
mask = x > 1
slice_y_greater_than_one = tf.boolean_mask(y, mask)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print (sess.run(slice_y_greater_than_one)) # [2 4]
收藏
评论

我不会说这完全没有实施。双重否定怎么样?

Tensorflow实际上支持很多切片和切块,尽管语法可能不太漂亮。例如,如果要创建一个新数组,当x>1时它等于y ,否则要等于0,则可以这样做。查看比较运算符,例如

masked = tf.greater(x,1)
zeros = tf.zeros_like(x)
new_tensor = tf.where(masked, y, zeros)

另一方面,如果您想创建一个仅包含x>1的家伙的新数组,则可以通过将wheregather函数结合在一起来做到这一点。 gather详细信息可以在以下位置找到

https://www.tensorflow.org/versions/master/api_docs/python/array_ops/slicing_and_joining

PS。当然, x>1相对于x是不可微分的... tf可能很棒,但是它在魔术方面不起作用:)。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号