TensorFlow仅公开一个用户可见的图形,即用户指定的图形 . 用户可以使用Session.run()或在某个张量上调用Tensor.eval()来运行图形 . Session.run() 调用可以指定要提供的一些张量和要提取的其他张量 . 根据需要获取的内容,TensorFlow运行时可以在内部构建和优化各种数据结构,包括用户可见图的修剪版本 . 但是,无论如何,用户都看不到此内部图形 . 不,TensorFlow没有't '预先生成' all possible graphs. Yes, TensorFlow does perform extensive optimizations on the computation graph. And finally, changing the batch size of a tensor that is fed doesn' t更改图形的结构 .
2 回答
作为keveman says,从客户端的角度来看,有一个TensorFlow图 . 在运行时中,可以有多个修剪的子图,它们只包含计算调用sess.run([t1, t2, ...])时获取的值
t1
,t2
等所必需的节点 .如果调用
sess.run([t1, t2])
将整个图形(sess.graph
)修剪为计算这些值所需的子图形:即产生t1
和t2
的操作及其所有前提 . 如果随后调用sess.run([t3, t4])
,则运行时会将图形向下修剪为计算t3
和t4
所需的子图形 . 每次将一个新的值组合传递给fetch时,TensorFlow将计算一个新的修剪图并对其进行缓存 - 这就是为什么第一个sess.run()
可能比后续的慢一些 .如果修剪的图形重叠,TensorFlow将重用"kernel"作为共享的操作 . 这是相关的,因为某些操作(例如tf.Variable和tf.FIFOQueue)是有状态的,并且它们的内容可以在两个修剪的图形中使用 . 例如,这允许您使用一个子图(例如
sess.run(tf.initialize_all_variables())
)初始化变量,使用另一个子图(例如sess.run(train_op)
)训练它们,并使用第三个(例如sess.run(loss, feed_dict={x: ...})
)评估您的模型 . 它还允许您使用一个子图将元素排入队列,并使用另一个子图将它们出列,这是input pipelines的基础 .TensorFlow仅公开一个用户可见的图形,即用户指定的图形 . 用户可以使用Session.run()或在某个张量上调用Tensor.eval()来运行图形 .
Session.run()
调用可以指定要提供的一些张量和要提取的其他张量 . 根据需要获取的内容,TensorFlow运行时可以在内部构建和优化各种数据结构,包括用户可见图的修剪版本 . 但是,无论如何,用户都看不到此内部图形 . 不,TensorFlow没有't '预先生成' all possible graphs. Yes, TensorFlow does perform extensive optimizations on the computation graph. And finally, changing the batch size of a tensor that is fed doesn' t更改图形的结构 .