假设我们有一些方法foo
,我们在图形构造期间调用它,每次调用它时都返回一些tf.Tensors
或它们的嵌套结构,还有许多其他方法利用foo
的结果。为了提高效率并避免使用不必要的重复操作对TF图进行垃圾处理,在第一次调用时,可能会让foo
缓存它的结果(以重用它生成的子图)。但是,如果在控制流的上下文中使用foo
,如tf.cond
、tf.map_fn
或tf.while_loop
,则该操作将失败。你知道吗
我的问题是:
什么时候可以安全地缓存tf.Tensor
对象而不引起控制流的问题?也许有什么方法可以检索创建tf.Tensor
的控制流(如果有的话),存储它并稍后进行比较,以查看是否可以重用缓存的结果?
上述问题的答案如何适用于tf.Operations
?
(更新了问题文本,以便更清楚地说明foo
每次调用时都会创建一组新的张量)
TL;DR:TF已经缓存了它需要的东西,你自己不用麻烦了。你知道吗
每次调用
sess.run([some_tensors])
TF的引擎时,找到计算[some_tensors]
中所有张量所需的最小子图,然后从上到下运行它(可能是在新数据上,如果您没有输入相同的数据)。你知道吗这意味着,在
sess.run
调用之间缓存结果对于节省计算是无用的,因为它们无论如何都会被重新计算。你知道吗如果您关心的是在一次调用
sess.run
中使用与输入数据相同的多个张量,请不要担心,TF已经足够聪明了。如果您有输入A
和B = 2*A
,C = A + 1
,只要您做了^{sess.run
调用,作为sess.run([B,C])
A
的调用将只被计算一次(然后由TF引擎隐式缓存)。你知道吗相关问题 更多 >
编程相关推荐