在什么阶段设置了张量流图?

时间:2016-02-18 20:19:43

标签: tensorflow tensorflow-serving

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

2 个答案:

答案 0 :(得分:7)

作为keveman says,从客户的角度来看,有一个TensorFlow图。在运行时中,可以有多个 pruned 子图,它们只包含计算调用时t1t2等所需的节点sess.run([t1, t2])sess.graph等。 }}

如果您致电t1,则会将整个图表(t2)修剪为计算这些值所需的子图:即生成sess.run([t3, t4])t3的操作他们所有的前因。如果您随后调用t4,运行时会将图形向下修剪为计算sess.run()sess.run(tf.initialize_all_variables())所需的子图。每次将一个新的值组合传递给fetch时,TensorFlow将计算一个新的修剪图并对其进行缓存 - 这就是为什么第一个sess.run(train_op)可能比后续的慢一些。

如果修剪后的图形重叠,TensorFlow将重用"内核"对于共享的操作。这是相关的,因为某些操作(例如sess.run([t1, t2, ...])tf.Variable有状态,并且它们的内容可以在两个已修剪的图形中使用。例如,这允许您使用一个子图(例如sess.run(loss, feed_dict={x: ...}))初始化变量,使用另一个子图(例如>>> def mydist(x, y): ... return np.sum((x-y)**2) ... >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) >>> nbrs = NearestNeighbors(n_neighbors=4, algorithm='ball_tree', ... metric='pyfunc', func=mydist) )训练变量(例如_init_params() got an unexpected keyword argument 'func'),并使用第三个(例如sklearn.neighbors评估模型)。它还允许您使用一个子图将元素排入队列,并使用另一个子图将它们排队,这是tf.FIFOQueue的基础。

答案 1 :(得分:5)

TensorFlow只公开一个用户可见的图形,即用户指定的图形。用户可以使用Session.run()运行图表,也可以在某个张量上调用Tensor.eval()Session.run()调用可以指定要提供的一些张量以及要提取的其他张量。根据需要获取的内容,TensorFlow运行时可以在内部构建和优化各种数据结构,包括用户可见图的修剪版本。但是,无论如何,用户都看不到此内部图形。不,TensorFlow不会“预生成”所有可能的图形。是的,TensorFlow会对计算图执行大量优化。最后,更改馈送的张量的批量大小不会改变图形的结构。