我的问题是,如果一个操作的参数是常量,TF会缓存结果:
a = tf.constant(np.random.randn(*(100, 101)))
b = tf.constant(np.random.randn(*(100, 102)))
c = tf.constant(np.random.randn(*(101, 102)))
# Some expensive operation.
res = tf.einsum('si,sj,ij->s', a, b, c)
%timeit sess.run(res)
最慢的运行时间比最快的运行时长577.76倍。这可能意味着正在缓存中间结果。 10000个循环,最佳3:每循环137μs
如果我在每次运行时从头开始生成张量,那么我也在计算张量生成的开销:
a = tf.random_normal((100, 101))
b = tf.random_normal((100, 102))
c = tf.random_normal((101, 102))
res = tf.einsum('si,sj,ij->s', a, b, c)
%timeit sess.run(res)
最慢的运行时间比最快的运行时长4.07倍。这可能意味着正在缓存中间结果。 10个循环,每个循环最好为3:28 ms
也许在这个特定的例子中,开销并不大,但对于更便宜的操作,它可能很重要。
有没有办法冻结参数,以便它们不会在每个sess.run()上重新计算,但是会抑制所有其他缓存?
答案 0 :(得分:0)
在每次运行(跨会话)时,将评估传递给sess.run()
的任何张量对象。来自文档:
Session对象封装了Operation对象所在的环境 执行,并评估Tensor对象。
不可能忽略跨会话的评估(计算值),只要它是要评估的表达式的一部分。
在您的示例中,张量对象a, b, c
始终在每个会话中进行评估,因为计算einsum需要它们的值。但是,在一个会话中,它们只计算一次并在运行中缓存。
但是,在一个会话中,你可以让它只被评估一次并在其他地方使用它。但同样,这只适用于会话。