python - Session.run() 如何选择要运行的子图

标签 python variables tensorflow graph variable-assignment

我试图了解 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 和 allocate。为了获得 z,我需要 foo()。当 foo() 运行时,也会运行 assign = tf.assign(x[4], 100) 。但是,输出是 [1, 2, 3, 4, 5] 13,我不知道 13 来自哪里。

最佳答案

无法保证首先执行哪一个独立操作,因此在这两种情况下您都可以获得 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 在 session 启动之前仅被调用一次。我认为,最好的方式是在张量板上可视化该图。

如果你说...

sess.run(z)

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

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

y = x + 2

...这个依赖项:为了计算y,tensorflow必须计算x。希望现在可以更清楚了。

关于python - Session.run() 如何选择要运行的子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48465510/

相关文章:

python - 如何让python程序在每次下载文件时自动运行?

python - 将日志记录语句放在模块级别与类级别有什么区别吗?

python - 在 Python 中使用 Twilio 接收和处理 SMS

php - 查询结果存入变量

Tensorflow 无法注册 CUDNN 处理程序

python - 如何在解析过程中丢弃 pyparsing parseResults?

javascript - 如何在 Javascript 中存储变量的前一个值?

java - 在类之间共享变量

python - 使用 Tensorflow 计算 MNIST 图像的熵

python - 交换矩阵行和列中的元素 - TensorFlow scatter_nd