Tensorflow 使用大于等于切片张量的tf.boolean_掩码

Tensorflow 使用大于等于切片张量的tf.boolean_掩码,tensorflow,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

我试图使用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]

我该怎么做?

好问题!这让我困惑了一分钟,答案最终是微不足道的,但却是tensorflow如何运作的重要一课

首先是一些工作代码:

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]))
结果:

[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)]
请注意,myArray是一个OP,不是一个变量。在调用
sess.run
(在本例中为
eval
,但使用
eval
使其不那么明显)时,会计算OP(操作的缩写)

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

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