我是张量流初学者。根据{{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 为什么我的预期输出与实际输出不同?
答案 0 :(得分:2)
tensorflow
的棘手部分是该代码用于构建计算图,然后可以在tf.Session
中运行/求值。
在您的示例中,每次评估时,都会生成随机张量x
和y
。
因此,您的呼叫x.eval()
生成随机张量x
和y
。
您的调用y.eval()
会重新生成随机张量x
和y
。
sess.run(tf.greater(x, y))
和sess.run(out)
也是如此。
因此,您对x
和y
的打印不会反映出x
和y
中使用的实际sess.run(tf.greater(x, y))
和sess.run(out)
(顺便说一句还解释了为什么您的结果0.3438499
与x+y
或x-y
都不对应。
通过将张量x
和y
冻结为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.greater
或tf.cond
没错。但是由于这两个参数是在不同的会话运行中执行的,因此从x
和y
采样的值在每个参数中都会不同。通过在输出旁边获取x
和y
可以注意到这一点:
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]
或将x
和y
转换为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]