我试图使用张量流生成斐波纳契数:F(n + 2)= F(n + 1)+ F(n)。每次运行我的代码时,都会产生不同的结果,非常奇怪。代码很简单,粘贴在下面。
import tensorflow as tf
a = tf.Variable(1)
b = tf.Variable(1)
c = tf.Variable(2)
sum=tf.add(a,b)
as0 = tf.assign(a,b)
as1=tf.assign(b, c)
as2=tf.assign(c, sum)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(10):
print(sess.run([as2, as1,as0]))
答案 0 :(得分:3)
我认为@gdelab回答它不是完全正确。我的意思是,解决问题是正确的,但我认为这不是真正的原因。这是我的猜测。
我强烈认为您正在尝试在Jupyter笔记本上运行该代码。如果那不对,那么我可能错了。好吧,假设这是真的:
答案 1 :(得分:0)
这很有趣!
您调用sess.run()时似乎不知道图表的执行顺序,或者至少您不知道每个张量的计算完成的顺序因此,分配和总和是以错误的(每次可能不同的)顺序执行的。通过强制图形以正确的顺序执行操作,以下代码可以正常工作:
import tensorflow as tf
a = tf.Variable(1)
b = tf.Variable(1)
c = tf.Variable(2)
sum=tf.add(a,b)
as0 = tf.assign(a,b)
as1=tf.assign(b, c)
as2=tf.assign(c, sum)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(10):
sess.run(as0)
sess.run(as1)
print(sess.run(as2))
这不太实用,因为它不在图中。 您可以使用flow control ops来强制它们按正确的顺序执行。
答案 2 :(得分:0)
如果某些操作可以与另一个并行执行,它们可能会是。因此,执行顺序不是您编写的操作的顺序。
执行的顺序仅在显式强制(使用tf.control_dependencies
)或在计算另一个节点之前必须计算节点时(当节点是另一个节点的前提条件时)存在
让我们深入研究您的代码:
a = tf.Variable(1)
b = tf.Variable(1)
c = tf.Variable(2)
sum=tf.add(a,b)
到目前为止,您刚刚定义了3个变量和一个操作。 请注意:您定义了节点。什么也没发生。
as0 = tf.assign(a,b)
as1=tf.assign(b, c)
as2=tf.assign(c, sum)
这里定义 3分配操作。他们之间有无顺序。 没有人知道之前和之后会执行什么,因为它们之间没有因果关系。
您唯一能确定的是,在将sum
的值分配给c
之前,必须执行总和。
因此,在您的图表中,只有一个箭头从sum
节点转到assign(c,sum)
节点。
P.S:这不是像Fibonacci序列那样的计算操作的推荐方法。相反,您应该使用具有任何参数accumulator
的{{3}}来帮助您。