当前位置: 首页 > 知识库问答 >
问题:

TensorFlow是否优化以避免不必要的图重新执行?

鲜于仰岳
2023-03-14

我大致了解了TensorFlow图在评估它包含的Tensors之一时是如何评估的:该张量的runval的执行将触发图中所需的所有级联计算计算该张量的值,因此,图中“导致它”的任何张量也将被计算,并且连接它们的任何操作都将被运行。

因此,如果我有一个包含张量out\u a的图,其计算涉及(可能在许多其他事情中)使用int\u b的操作,这反过来(最终)需要执行本身(最终)使用in的操作

a, b, o = sess.run([out_a, int_b, an_op], feed_dict={in: x})

将只评估out_aint_ban_op一次:out_aint_b的计算都使用an_op的相同执行;用于提供int_b的计算与计算out_a中使用的计算相同。(例如,如果我稍后引用a,我使用的是评估张量out_a的值,因此不会进一步执行。)

但是,如果我不以这种方式合并我的操作,会发生什么

o = sess.run(an_op, feed_dict={in: x})
# ... and later yet, after I remember I need `int_b`:
b = sess.run(int_b, feed_dict={in: x})
# ... later, after I remember I need `out_a`:
a = sess.run(out_a, feed_dict={in: x})

在这种情况下,TensorFlow是否执行了任何优化以避免计算an_op第二次和第三次,以及int_b第二次,可能会触发这些计算的副作用?

共有1个答案

沈俊美
2023-03-14

在这种情况下,TensorFlow是否进行了任何优化,以避免第二次和第三次计算an\u op,第二次计算int\u b,从而可能触发这些计算的副作用?

不,这取决于开发人员是否记住需要执行哪些计算,并将它们全部放在SES的列表中。运行函数(按您描述的方式)。

您可以通过运行以下代码进行验证:

import tensorflow as tf
import numpy as np
from datetime import datetime

n = 3000
t = np.random.rand(n,n)
a = tf.Variable(t)
b = tf.matmul(a, a)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    startTime = datetime.now()
    _ = sess.run(b)
    print datetime.now() - startTime

    startTime = datetime.now()
    _ = sess.run(b)
    print datetime.now() - startTime

    startTime = datetime.now()
    _ = sess.run(b)
    print datetime.now() - startTime

在我的机器上返回:

0:00:02.798704
0:00:02.940005
0:00:03.039798

如果数据将被缓存,第二次运行将立即返回。

 类似资料:
  • 问题内容: 我一直在研究优化LinkedList的方法。有人知道Java默认的双向链接LinkedList类是否经过优化以进行反向操作吗?例如: 将调用优化搜索和走在相反,因为它是一个双向链表?如果您知道该元素位于列表的后半部分,则从末尾开始搜索并向中心搜索会更有意义。 我知道用的是时间,遍历LinkedList时应该使用迭代器,但是我很好奇。 问题答案: 是的。您可以自己检查源代码:http :

  • 条款14:使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,只要需要更多空间,就以realloc等价的思想来增长。这个类似于realloc的操作有四个部分: 分配新的内存块,它有容器目前容量的几倍。在大部分实现

  • 本文向大家介绍在React中如何避免不必要的render?相关面试题,主要包含被问及在React中如何避免不必要的render?时的应答技巧和注意事项,需要的朋友参考一下 shouldComponentUpdate、memoization、PureComponent

  • 我正在编写一些Swing应用程序,用于使用MigLayout进行测量。我试图消除不必要的差距。 我已经注意到,由于顶部的句子,差距是存在的。然而,当我删除它时,它看起来很好。 该问题在下图中可见: 我加句子的方式是: 我添加按钮的方式: 有人能帮我解释一下为什么会发生这种情况,以及我如何消除与现在句子的差距吗? ////////////编辑 我想使用我当前的基础架构,我已经在miglaway中启用

  • 问题内容: 我发现JavaScipt和通过bash(和其他编程语言)创建的json- data之间存在差异。使用JavaScript,即使使用,我也可以创建最多六位的十进制数字。但是与它不同,因为添加十进制值只需要在小数点后四位数字。 我的问题是我需要十进制数字存储在SQL中,该点后最多六位数字。 例: 我的目标是用此行验证小数点… 有什么建议/建议吗? 问题答案: 您无法更改其行为-目前,相关功

  • 我有一个典型的Antlr 4.5项目,其中有两个语法文件:MyLexer。g4和MyParser。Antlr从中生成6个输出文件:MyLexer。java,MyLexer。标记,MyParser。java,MyParser。令牌,MyParserBaseListener。java和MyParserListener。Java语言gradle任务都工作正常,因此输出文件都按预期生成、编译和测试。 问题