优化器通常在许多步骤中运行相同的计算图,直到收敛。tensorflow 是否在开始时设置图形并在每个步骤中重复使用它?如果我在训练期间更改批量大小怎么办?如果我对图形进行一些负更改,例如更改损失函数,该怎么办?如果我对图表进行了一些重大更改怎么办?tensorflow 会预先生成所有可能的图表吗?当图发生变化时,tensorflow 是否知道如何优化整个计算?
2 回答
正如keveman 所说,从客户的角度来看,只有一个 TensorFlow 图。在运行时,可以有多个修剪子图,其中仅包含计算值所需的节点t1
等t2
,您在调用sess.run([t1, t2, ...])
.
如果您调用sess.run([t1, t2])
,则将整个图 ( sess.graph
) 修剪为计算这些值所需的子图:即产生t1
和t2
及其所有前项的操作。如果您随后调用,运行时会将图修剪为计算和sess.run([t3, t4])
所需的子图。每次你传递一个新的值组合来获取时,TensorFlow 都会计算一个新的剪枝图并缓存它——这就是为什么第一个可能比后续的慢一些。t3
t4
sess.run()
如果修剪后的图重叠,TensorFlow 将为共享的操作重用“内核”。这是相关的,因为某些操作(例如tf.Variable
和tf.FIFOQueue
)是有状态的,并且它们的内容可以在两个修剪后的图中使用。例如,这允许您用一个子图(例如 )初始化变量,用另一个子图(例如sess.run(tf.initialize_all_variables())
)训练它们sess.run(train_op)
,并用第三个子图(例如 )评估您的模型sess.run(loss, feed_dict={x: ...})
。它还允许您使用一个子图将元素排入队列,并使用另一个子图将它们出列,这是输入管道的基础。
TensorFlow 只公开一个用户可见的图,即用户指定的图。用户可以使用Session.run()
或调用Tensor.eval()
某个张量来运行图形。调用可以指定一些要馈送的Session.run()
张量和要获取的其他张量。根据需要获取的内容,TensorFlow 运行时可以在内部构建和优化各种数据结构,包括用户可见图的修剪版本。然而,无论如何,这个内部图表对用户是不可见的。不,TensorFlow 不会“预生成”所有可能的图表。是的,TensorFlow 确实对计算图进行了广泛的优化。最后,改变输入的张量的批量大小不会改变图的结构。