这是tensorflow中的错误吗?
我试图用张量流生成斐波那契数:F(n+2)=F(n+1)+F(n)。每次我运行我的代码,它都会产生不同的结果,非常奇怪。代码很简单,粘贴在下面这是tensorflow中的错误吗?,tensorflow,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.Se
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]))
真有趣
似乎您不知道调用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))
这是不太实际的,因为它超出了图表范围。
你可以用vbl来强制他们按正确的顺序执行。我认为@gdelab回答它不完全正确。我的意思是,这确实解决了问题,但我认为这不是真正的原因。我猜是这样的 我强烈认为您正在试图在Jupyter笔记本上运行该代码。如果那不是真的,那么我可能错了。好吧,假设这是真的:
现在,请不要告诉我你没有使用Jupyter笔记本:)如果某个操作可以与另一个操作并行执行,它们可能会并行执行。因此,执行的顺序不是您编写的操作的顺序 仅当显式强制执行(使用)或必须在计算另一个节点之前计算一个节点(当一个节点是另一个节点的先决条件时)时,执行顺序才存在 让我们深入了解您的代码:
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
因此,在图形中只有一个箭头从sum
节点指向assign(c,sum)
节点
附言:这不是像斐波那契序列那样计算运算的推荐方法。相反,您应该使用具有任何参数
累加器的函数,该函数对您有很大帮助。它返回不同的结果是什么意思?我刚试过,每次都一样。似乎无法正确生成您的序列,尽管这很有趣!我每次也会得到不同的值,总是不正确的,总是第二和第三个元素相等,并且as2[I]=as1[I]+as1[I-1]。我的猜测是,在调用sess.run()时,您不知道图形的执行顺序,因此赋值和求和的执行顺序是错误的(可能每次都不同),就您所知,这可能吗?顺便说一下,问题的标题太宽泛了,您应该将其更改为更好地描述您的问题的内容。您会发现这个问题也很有趣,但本质上这是一个不同的问题--澄清sess.run()中元素的实际求值顺序。但有一点是清楚的:仅仅执行tf.assign()是不够的,因为您还需要运行assign的()/eval(),以便实际执行它。因此,由于您同时执行所有这些操作,并且其中一些操作相互依赖,问题就变成了TF在一次操作中实际执行它们的顺序。我以前在这里看到过这个问题,但我不记得在“TF解决它”之外看到过清楚的答案。很高兴听到TF的消息!