【问题标题】:Tensorflow indexing with boolean tensor带有布尔张量的张量流索引
【发布时间】:2016-02-19 12:55:17
【问题描述】:

在 numpy 中,有两个相同形状的数组,xy,可以像 y[x > 1] 那样做切片。您如何在 tensorflow 中获得相同的结果? y[tf.greater(x, 1)] 不起作用,tf.slice 也不支持这样的东西。现在有没有办法使用布尔张量进行索引,还是目前不支持?

【问题讨论】:

标签: python indexing tensorflow


【解决方案1】:

试试:

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]

【讨论】:

    【解决方案2】:

    我不会说它完全没有实现。双重否定是怎么回事?

    Tensorflow 实际上支持相当多的切片和切块,尽管语法可能稍微不那么漂亮。例如,如果你想创建一个新数组,当x>1 时等于y,否则等于0,你绝对可以这样做。查看comparison operators 例如

    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 可能很棒,但它不起作用:)。

    【讨论】:

    【解决方案3】:

    这个暂时没有实现,这里是跟踪进度的 GitHub issue -- https://github.com/tensorflow/tensorflow/issues/206

    【讨论】:

    【解决方案4】:

    正在寻找类似的功能,以通过定义的标准减少 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再次恢复原始值。

    【讨论】:

      【解决方案5】:

      tf.boolean_mask 可以完成这项工作,但在 Raspberry Pi 或 OSX 等某些平台上,Tensorflow Wheel 发行版不支持该操作(请查看此tf.boolean_mask not supported on OSX。因此另一种方法是使用wheregather 作为@Jackson Loper 建议。例如:

      x = tf.Variable([1, 2, 0, 4])
      ix = tf.where(x > 1)
      y = tf.gather(x, ix)
      
      with tf.Session() as sess:
       sess.run(tf.global_variables_initializer())
       print(sess.run(y))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 2018-07-31
        相关资源
        最近更新 更多