怎样会话.运行()选择要运行的子图

2024-09-23 22:32:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道会话.运行()在张量流中工作。我知道会话.运行()运行我们给它的“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)

使用此代码:

^{pr2}$

(唯一的变化是在第二个代码中分配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)

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


Tags: run代码footfaswithvariabletmp
1条回答
网友
1楼 · 发布于 2024-09-23 22:32:05

不保证哪个独立的操作首先执行,所以这两种情况下都可以得到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只在会话启动之前调用一次。我认为,最好的办法是把这个图形形象化。在

如果你说。。。在

^{pr2}$

。。。tensorflow不会运行assign,因为它不运行python函数,它计算张量。张量x或{}不依赖于运算assign。在

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

y = x + 2

。。。这个是一个依赖关系:为了计算y,tensorflow必须计算x。希望这能让事情变得更清楚。在

相关问题 更多 >