在什么阶段建立tensorflow图?

在什么阶段建立tensorflow图?,tensorflow,tensorflow-serving,Tensorflow,Tensorflow Serving,优化器通常会在许多步骤中运行相同的计算图,直到收敛。tensorflow是否在开始时设置图形,并在每个步骤中重复使用?如果我在培训期间更改批次大小会怎样?如果我对图做一些负的改变,比如改变损失函数,会怎么样?如果我对图表做了一些重大更改,会怎么样?tensorflow是否预先生成了所有可能的图?tensorflow知道如何在图形更改时优化整个计算吗?tensorflow只公开一个用户可见的图形,即用户指定的图形。用户可以使用或通过调用某些张量来运行图形。Session.run()调用可以指定要输

优化器通常会在许多步骤中运行相同的计算图,直到收敛。tensorflow是否在开始时设置图形,并在每个步骤中重复使用?如果我在培训期间更改批次大小会怎样?如果我对图做一些负的改变,比如改变损失函数,会怎么样?如果我对图表做了一些重大更改,会怎么样?tensorflow是否预先生成了所有可能的图?tensorflow知道如何在图形更改时优化整个计算吗?

tensorflow只公开一个用户可见的图形,即用户指定的图形。用户可以使用或通过调用某些张量来运行图形。
Session.run()
调用可以指定要输入的一些张量和要提取的其他张量。根据需要获取的内容,TensorFlow运行时可以在内部构建和优化各种数据结构,包括用户可见图的删减版本。但是,用户无论如何都看不到该内部图形。不,TensorFlow不会“预生成”所有可能的图形。是的,TensorFlow确实对计算图进行了广泛的优化。最后,改变输入的张量的批量大小不会改变图的结构。

因为,从客户的角度来看,只有一个张量流图。在运行时,可以有多个修剪子图,其中只包含计算调用时获取的值
t1
t2
等所需的节点

如果调用
sess.run([t1,t2])
将把整个图(
sess.graph
)删减为计算这些值所需的子图:即产生
t1
t2
的操作及其所有先行项。如果随后调用
sess.run([t3,t4])
,则运行时将把图形裁剪为计算
t3
t4
所需的子图形。每次传递要获取的新值组合时,TensorFlow将计算一个新的修剪图并将其缓存。这就是为什么第一个
sess.run()
可能比后续的要慢一些


如果修剪后的图重叠,TensorFlow将为共享的ops重用“内核”。这是相关的,因为一些操作(例如and)是有状态的,它们的内容可以在两个修剪图中使用。例如,这允许您使用一个子图初始化变量(例如
sess.run(tf.initialize_all_variables())
),使用另一个子图训练变量(例如
sess.run(train_op)
),并使用第三个子图(例如
sess.run(loss,feed_dict={x:…})
)评估模型。它还允许你用一个子图将元素排到队列中,并将它们排到另一个子图,这是.

@ MRY的基础。如果在不同的张量/运算上调用Session.run()两次,我仍然不太明白会发生什么,这可能需要不同的计算图。(在一个典型的优化问题中,Session.run()会被反复调用以执行同一个op,但op在原则上可能会改变。)我添加了一个回答,解决了您的后续问题。让我知道,如果它使事情清楚@我知道了。现在可以走了。谢谢!需要注意的是,修剪不包括对
tf.cond
节点的非活动分支进行修剪。对
fn1
fn2
的输入都保留在图形中并进行计算。只有在
fn1
fn2
函数中定义的节点是有条件计算的。