随机值张量的计算(例如tf.greater和tf.cond)未按预期工作

时间:2018-08-29 09:16:03

标签: python tensorflow

我是张量流初学者。根据{{​​3}}, tf.greater按元素返回(x> y)的真值

我的代码如下:

x = tf.random_uniform([])  # Empty array as shape creates a scalar.
y = tf.random_uniform([])
print('x: '+str(x.eval()))
print('y: ' +str(y.eval()))
out = tf.cond(tf.greater(x, y), lambda: x + y, lambda: x - y)
print(sess.run(tf.greater(x, y)))
print(sess.run(out))

我得到的输出是:

x: 0.79379404
y: 0.30891895
False
0.3438499

x大于y,因此它应返回True,x + y应为1.10271299 为什么我的预期输出与实际输出不同?

2 个答案:

答案 0 :(得分:2)

tensorflow的棘手部分是该代码用于构建计算图,然后可以在tf.Session中运行/求值。

在您的示例中,每次评估时,都会生成随机张量xy

  • 因此,您的呼叫x.eval()生成随机张量xy

  • 您的调用y.eval()会重新生成随机张量xy

  • sess.run(tf.greater(x, y))sess.run(out)也是如此。

因此,您对xy的打印不会反映出xy中使用的实际sess.run(tf.greater(x, y))sess.run(out)(顺便说一句还解释了为什么您的结果0.3438499x+yx-y都不对应。

通过将张量xy冻结为tf.constant,您可以获得预期的行为:

import numpy as np
import tensorflow as tf

with tf.Session() as sess:
   x = tf.constant(np.random.uniform())
   y = tf.constant(np.random.uniform())
   print('x: '+str(x.eval()))
   print('y: '+str(y.eval()))
   out = tf.cond(tf.greater(x, y), lambda: x + y, lambda: x - y)
   print(sess.run(tf.greater(x, y)))
   print(sess.run(out))

打印(一次在我这边)

x: 0.75513345
y: 0.04605962
True
0.80119306

答案 1 :(得分:0)

tf.greatertf.cond没错。但是由于这两个参数是在不同的会话运行中执行的,因此从xy采样的值在每个参数中都会不同。通过在输出旁边获取xy可以注意到这一点:

x = tf.random_uniform([])
y = tf.random_uniform([])
g = tf.greater(x, y)      # you can also do `x > y`, same TF op
c = tf.cond(g, lambda: x + y, lambda: x - y)
sess = tf.Session()
sess.run([x, y, g])
sess.run([x, y, c])

输出:

[0.11019015, 0.028247476, True]
[0.29905212, 0.9846852, -0.68563306]

为了确保这些操作使用相同的值,您可以在同一运行中执行两个操作:

sess.run([x, y, g, c])
[0.74283457, 0.8982569, False, -0.15542233]

或将xy转换为TensorFlow变量,这些变量将从分配中保留相同的数字,直到下一次重新分配为止。

x = tf.get_variable('x', shape=[], initializer=tf.random_uniform_initializer())
y = tf.get_variable('y', shape=[], initializer=tf.random_uniform_initializer())

g = x > y
c = tf.cond(g, lambda: x + y, lambda: x - y)

reset_vars = tf.variables_initializer([x, y])

sess = tf.Session()
sess.run(reset_vars) # this must be called once
sess.run([x, y, g])
sess.run([x, y, c])
[0.4862318, 0.48253357, True]
[0.4862318, 0.48253357, 0.9687654]