假设我们在图形构建时调用了一些方法foo
,每次调用时返回一些tf.Tensors
或它们的嵌套结构,以及使用{{1}的多个其他方法结果。为了提高效率并避免使用不必要的重复操作向TF图表发送垃圾邮件,可能很有可能在第一次调用时foo
缓存其结果(以重用它生成的子图)。但是,如果在控制流的上下文中使用foo
,则会失败,例如foo
,tf.cond
或tf.map_fn
。
我的问题是:
何时以不会导致控制流问题的方式缓存tf.while_loop
对象是否安全?也许有一些方法可以检索创建tf.Tensor
的控制流(如果有的话),存储它并稍后比较它以查看是否可以重用缓存的结果?
上述问题的答案如何适用于tf.Tensor
?
(问题文本已更新,以便更清楚tf.Operations
每次都会创建一组新的张量)
答案 0 :(得分:0)
TL; DR :TF已经缓存了所需的内容,请不要自己烦恼。
每次拨打sess.run([some_tensors])
TF的引擎时,都会找到计算[some_tensors]
中所有张量所需的最小子图,从上到下依次运行(可能是新数据,如果你没有给它提供相同的数据)。
这意味着,在sess.run
次调用之间缓存结果对于保存计算毫无用处,因为它们无论如何都会被重新计算。
如果,您反而需要使用与sess.run
的一个电话中的输入相同的数据来使用多个张量,并且#39不用担心,TF很聪明。如果您输入A
和B = 2*A
,C = A + 1
,只要您进行一次 sess.run
来电sess.run([B,C])
{{1}将仅评估一次(然后由TF引擎隐式缓存)。