这是张量流中的错误吗?

时间:2017-06-21 12:32:58

标签: tensorflow

我试图使用张量流生成斐波纳契数: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]))

3 个答案:

答案 0 :(得分:3)

我认为@gdelab回答它不是完全正确。我的意思是,解决问题是正确的,但我认为这不是真正的原因。这是我的猜测。

我强烈认为您正在尝试在Jupyter笔记本上运行该代码。如果那不对,那么我可能错了。好吧,假设这是真的:

  1. 首次运行代码时,它会提供正确的输出。First Time

  2. 第二次运行代码时,它会提供另一个输出。 enter image description here

  3. 但那是因为你不是从头开始运行的。也就是说,内核未重新启动且变量未被删除,因此输出会发生变化。如果您执行"重新启动内核" 然后再次运行代码,输出始终相同(第一个图像的输出){{3 }}

  4. 现在,请不要告诉我你没有使用Jupyter Notebook:)

答案 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}}来帮助您。