使用带有greater_equal的tf.boolean_mask来切割张量

时间:2018-03-26 21:24:53

标签: tensorflow

我正在尝试使用tf.boolean_mask从张量中选择某些值。

myArray = tf.random_normal([6], mean=1, stddev=4, seed = 1)
with tf.Session() as test_a:
    myMask =  tf.greater_equal(myArray, 0.5)
    myScores = tf.boolean_mask( myArray, myMask )
    print("myArray = ", myArray.eval())
    print("myMask = ", myMask.eval())
    print("myScores = ", myScores.eval())

我得到以下内容。

myArray =  [-2.24527287  6.93839502  1.26131749 -8.77081585  1.39699364  3.36489725]
myMask =  [False  True  True  True False False]
myScores =  [ 2.71667314  1.12839425  1.47780943  1.50100374]

我原本希望得到

myArray =  [-2.24527287  6.93839502  1.26131749 -8.77081585  1.39699364  3.36489725]
myMask =  [False  True  True  False True True]
myScores =  [ 6.93839502  1.26131749  1.39699364  3.36489725]

我该怎么做?

1 个答案:

答案 0 :(得分:2)

好问题!这让我难以理解,答案最终是微不足道的,但却是tensorflow如何运作的重要教训。

首先是一些工作代码:

<div id="container">
    <p>Container content</p>
    <div id="bottom">
        This flex content will stay at the bottom!
    </div>
</div>

结果:

import tensorflow as tf

myArray = tf.random_normal([6], mean=1, stddev=4, seed = 1)
myMask =  tf.greater_equal(myArray, 0.5)
myScores = tf.boolean_mask( myArray, myMask )

with tf.Session() as sess:
    print(sess.run([myArray, myMask, myScores]))

请注意,myArray是一个OP,不是一个变量。 OP(操作的简称)是在您调用[array([-2.2452729, 6.938395 , 1.2613175, -8.770817 , 1.3969936, 3.3648973], dtype=float32), array([False, True, True, False, True, True]), array([6.938395 , 1.2613175, 1.3969936, 3.3648973], dtype=float32)] 时计算的(或者在这种情况下为sess.run,但使用eval使其不那么明显。)

eval等变量从myVar = tf.variable(...)到另一个变量持续存在。由于myArray是一个OP,因此每次对tensorflow图执行任何操作时都会重新计算。由于您在3个单独的实例上调用了图形,因此每次调用时myArray都有3个不同的值。您只在第一个实例中打印myArray,并错误地认为它保持静止。

注意我发布的修改后的代码我现在在一个sess.run调用中请求所有3个变量,因此它们都使用相同的myArray值,并且所有结果都符合预期。