这是tensorflow中的错误吗?

这是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

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

似乎您不知道调用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的消息!