【问题标题】:How Session.run() chooses which sub-graph to runSession.run() 如何选择运行哪个子图
【发布时间】:2018-01-26 16:28:58
【问题描述】:

我试图了解 Session.run() 在 Tensorflow 流程中的工作原理。我知道 Session.run() 运行我们给它的“fetch”参数指定的子图。由于根据首先执行子图的哪一部分,我们可能会得到不同的结果,所以我试图看看是否真的如此。假设我们比较这段代码的输出:

import tensorflow as tf

x = tf.Variable(42)
assign1 = tf.assign(x, 13)
assign2 = tf.assign(x, 14)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2, val3 = sess.run([x, assign1, assign2])
    print(val1, val2, val3)

使用此代码:

import tensorflow as tf

x = tf.Variable(42)
assign2 = tf.assign(x, 14)
assign1 = tf.assign(x, 13)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2, val3 = sess.run([x, assign1, assign2])
    print(val1, val2, val3)

(唯一的变化是在第二个代码中首先分配 14)。我期待看到第一个代码产生输出 14、14、14,而第二个代码产生 13、13、13。

但是,结果是第一个产生了 13、13、13,而第二个产生了 14、14、14。

为什么会这样?


更新:以下选择的答案:

我不太明白什么是独立的,什么不是。例如,在以下代码中:

x = tf.Variable([1, 2, 3, 4, 5])

def foo():
    tmp_list = []
    assign = tf.assign(x[4], 100)
    for i in range(0, 5):
        tmp_list.append(x[i])
    return tmp_list

z = foo()

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    val1, val2 = sess.run([z, assign])
    print(val1, val2)

在我的 Session.run() 中,我有 z 和 assign。要获得 z,我需要 foo()。当 foo() 运行时,assign = tf.assign(x[4], 100) 也会运行。但是,输出是[1, 2, 3, 4, 5] 13,我不知道 13 是从哪里来的。

【问题讨论】:

    标签: python variables tensorflow graph variable-assignment


    【解决方案1】:

    无法保证先执行哪个独立操作,因此在这两种情况下您都可以得到 13 或 14。你的结果是纯粹的运气。试试这个:

    with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
      for i in range(100):
        val1, val2, val3 = sess.run([x, assign1, assign2])
        print(val1, val2, val3)
    

    ...您会看到 13 14 打印出来。


    后续问题的更新

    z = foo()(这只是x 切片的列表)不依赖于assign。请注意,foo 在会话开始之前只被调用一次。我认为,最好的方法是在 tensorboard 中可视化图形。

    如果你说...

    sess.run(z)
    

    ... tensorflow 不会运行assign,因为它不运行 python 函数,它会计算张量。并且张量xx[i] 不依赖于操作assign

    依赖是由张量执行的操作定义的。所以如果你有...

    y = x + 2
    

    ...这个一个依赖项:为了评估y,tensorflow 必须评估x。希望现在可以更清楚地说明这一点。

    【讨论】:

    • 感谢您的回答。一般来说,应该在“fetch”中放置什么?似乎 tf.assign 需要在“获取”中才能进行任何分配。那么像 tf.unstack、tf.one_hot、tf.mult 等呢?我曾经认为假设我们将某些东西放入“fetch”并运行它,Tensorflow 将运行影响该东西值的图形的每个部分,但从我的测试来看,它似乎运行图形的一部分,我们总是必须明确将其放入 fetch 中?
    • Tensorflow 自动运行所有依赖的操作,因此您可以在 fetches 中仅指定一个操作,它将从占位符开始计算所有内容。这种特殊情况是关于不依赖的操作
    • 我不太明白什么是依赖,什么不是。我在原始问题中有一个更新的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多