6

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

4

2 回答 2

8

正如keveman 所说,从客户的角度来看,只有一个 TensorFlow 图。在运行时,可以有多个修剪子图,其中仅包含计算值所需的节点t1t2,您在调用sess.run([t1, t2, ...]).

如果您调用sess.run([t1, t2]),则将整个图 ( sess.graph) 修剪为计算这些值所需的子图:即产生t1t2及其所有前项的操作。如果您随后调用,运行时会将图修剪为计算和sess.run([t3, t4])所需的子图。每次你传递一个新的值组合来获取时,TensorFlow 都会计算一个新的剪枝图并缓存它——这就是为什么第一个可能比后续的慢一些。t3t4sess.run()

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

于 2016-02-20T02:27:25.147 回答
6

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

于 2016-02-18T21:38:49.043 回答