节点的Tensorflow生命周期;

节点的Tensorflow生命周期;,tensorflow,machine-learning,tensorflow2.0,Tensorflow,Machine Learning,Tensorflow2.0,当评估两个变量TensorFlow时,不应重复使用先前评估中的值。(这是Aurélien Géron在机器学习与sklearn和TensorFlow手册中提到的) 以上面提到的代码为例。 如果在计算之间未修改x,则y和z应具有相同的值。 但我试着在评估之间修改它们的值,但它们仍然有相同的结果 with tf.compat.v1.Session() as sess: a = y.eval() x = w + 3 b = z.eval() 如果这是一个非常愚蠢的问题,我很抱

当评估两个变量TensorFlow时,不应重复使用先前评估中的值。(这是Aurélien Géron在机器学习与sklearn和TensorFlow手册中提到的)

以上面提到的代码为例。 如果在计算之间未修改x,则y和z应具有相同的值。 但我试着在评估之间修改它们的值,但它们仍然有相同的结果

with tf.compat.v1.Session() as sess:
    a = y.eval()
    x = w + 3
    b = z.eval()
如果这是一个非常愚蠢的问题,我很抱歉,但我只是想弄清楚我的基本知识,如果有人花时间来解释这一点,那将非常有帮助。谢谢

print(a) 
# 366
print(b)
# 366

为了澄清您的疑问,在您的代码中

w = tf.constant(5)
x = w + 5
y = x**2 + 5
z = x**2 + 5
只需创建一个计算图,直到创建一个
会话
,即使变量尚未初始化

在下面的代码中

with tf.compat.v1.Session() as sess:
    a = y.eval()
    x = w + 3
    b = z.eval()  
一旦会话打开,它将负责将所有操作放入正在使用的设备(CPU或GPU)中。它保存了里面的所有变量

在会话内部,一旦调用Tensorflow,就会自动确定它所依赖的节点,并首先计算这些节点,以解释您所采取的两种场景

1。a=y.eval()

这里y依赖于x,x依赖于w,所以它首先计算w,然后计算x来计算y

  • b=z.eval()
  • 这里z依赖于x,x依赖于w,再次从一开始它首先计算w,然后计算x来计算z它不会重用在y上执行的评估的x和w的结果

    在这两种评估中,节点都是由Tensorflow选择的,因为值x是第一个实例

    下面是计算的图形表示。您可以看到第二个x声明不是图的一部分(右角)

    如果要按顺序运行计算,可以使用
    sess.run()
    而不是
    eval()

    调用
    sess.run()
    时,此方法以以下方式完成图形中的一组计算:它从请求的输出开始,然后反向工作,计算必须根据依赖项集执行的节点

    下面是具有所需结果的修改示例

    import tensorflow as tf
    
    w = tf.constant(5)
    x = w + 5
    y = x**2 + 5
    x = w + 3
    z = x**2 + 5
    
    
    with tf.compat.v1.Session() as sess:
      # a = y.eval()
      # init.run()
      # b = z.eval()
      print(sess.run(z))
      print(sess.run(y)) 
    
    输出:

     69
    105
    

    您可以注意到,当请求
    sess.run(z)
    时,反向立即x值是
    x=w+3
    ,类似于
    sess.run(y)
    ,而反向计算时,立即x值是
    x=w+5
    为了澄清您的疑问,在您的代码中

    w = tf.constant(5)
    x = w + 5
    y = x**2 + 5
    z = x**2 + 5
    
    只需创建一个计算图,直到创建一个
    会话
    ,即使变量尚未初始化

    在下面的代码中

    with tf.compat.v1.Session() as sess:
        a = y.eval()
        x = w + 3
        b = z.eval()  
    
    一旦会话打开,它将负责将所有操作放入正在使用的设备(CPU或GPU)中。它保存了里面的所有变量

    在会话内部,一旦调用Tensorflow,就会自动确定它所依赖的节点,并首先计算这些节点,以解释您所采取的两种场景

    1。a=y.eval()

    这里y依赖于x,x依赖于w,所以它首先计算w,然后计算x来计算y

  • b=z.eval()
  • 这里z依赖于x,x依赖于w,再次从一开始它首先计算w,然后计算x来计算z它不会重用在y上执行的评估的x和w的结果

    在这两种评估中,节点都是由Tensorflow选择的,因为值x是第一个实例

    下面是计算的图形表示。您可以看到第二个x声明不是图的一部分(右角)

    如果要按顺序运行计算,可以使用
    sess.run()
    而不是
    eval()

    调用
    sess.run()
    时,此方法以以下方式完成图形中的一组计算:它从请求的输出开始,然后反向工作,计算必须根据依赖项集执行的节点

    下面是具有所需结果的修改示例

    import tensorflow as tf
    
    w = tf.constant(5)
    x = w + 5
    y = x**2 + 5
    x = w + 3
    z = x**2 + 5
    
    
    with tf.compat.v1.Session() as sess:
      # a = y.eval()
      # init.run()
      # b = z.eval()
      print(sess.run(z))
      print(sess.run(y)) 
    
    输出:

     69
    105
    
    您可以注意到,当请求
    sess.run(z)
    时,当执行向后计算时,立即数x值为
    x=w+3
    ,与
    sess.run(y)
    类似,立即数x值为
    x=w+5