我正在尝试使用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]
我该怎么做?
答案 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值,并且所有结果都符合预期。