【问题标题】:Tensorflow Life cycle of a node;TensorFlow 一个节点的生命周期;
【发布时间】:2020-07-26 03:52:29
【问题描述】:

当 TensorFlow 对两个变量进行评估时,它不应该重用之前评估的值。(这是 Aurélien Géron 在使用 sklearn 和 tensorflow 进行机器学习中提到的内容)

w = tf.constant(5)
x = w + 5
y = x**2 + 5
z = x**2 + 5

以上面提到的一段代码为例。 y 和 z 应该具有相同的值,如果 x 在它们的评估之间没有被修改。 但是我尝试在评估之间修改它们的值,但它们仍然具有相同的结果。

with tf.compat.v1.Session() as sess:
    a = y.eval()
    x = w + 3
    b = z.eval()

如果这是一个非常愚蠢的问题,我很抱歉,但我只是想弄清楚我的基础知识,如果有人花时间解释这个问题会非常有帮助。谢谢

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

【问题讨论】:

    标签: tensorflow machine-learning tensorflow2.0


    【解决方案1】:

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

    w = tf.constant(5)
    x = w + 5
    y = x**2 + 5
    z = x**2 + 5
    

    只创建一个计算图,直到你创建一个session,即使变量还没有初始化。

    在下面的代码中,

    with tf.compat.v1.Session() as sess:
        a = y.eval()
        x = w + 3
        b = z.eval()  
    

    会话打开后,它会负责将所有操作放入您正在计算的设备(CPU 或 GPU)中。它包含所有变量。

    在 Session 内部,一旦调用 eval,Tensorflow 就会自动确定它所依赖的节点,并首先评估这些节点,以向您解释您所采取的两种情况。

    1. a = y.eval()

    这里y依赖x,x依赖w,所以先计算w,再计算x计算y。

    1. b = z.eval()

    这里z依赖于x,x依赖于w,再次从开始它首先评估w并评估x以计算z。 它不会重用在 y 上完成的 eval 中 x 和 w 的结果

    在这两个 eval 中,节点都是由 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      相关资源
      最近更新 更多