在 TensorFlow 中缓存计算
Caching Computations in TensorFlow
是否有一种规范的方法可以重用 TensorFlow 中先前提供的占位符的计算?我的具体用例:
- 同时提供许多输入(使用一个占位符),所有这些都通过网络馈送以获得更小的表示
- 根据这些较小表示的各种组合定义损失
- 一次训练一个批次,其中每个批次使用输入的一些子集,无需重新计算较小的表示
这是代码中的目标,但它是有缺陷的,因为一次又一次地执行相同的计算:
X_in = some_fixed_data
combinations_in = large_set_of_combination_indices
for combination_batch_in in batches(combinations_in, batch_size=128):
session.run(train_op, feed_dict={X: X_in, combinations: combination_batch_in})
谢谢。
在 sess.Run() 调用之间共享计算值的规范方法是使用 Variable
。在这种情况下,您可以设置图形,以便在输入占位符时,它们会计算保存到变量中的表示的新值。图表的一个单独部分读取这些变量来计算损失。如果您需要通过计算表示的图形部分计算梯度,这将不起作用。计算这些梯度将需要重新计算编码器中的每个 Op。
这种事情应该用CSE(公共子表达式消除)自动解决。不确定 TensorFlow 现在支持什么,可能有点参差不齐,但是图形选项有 optimizer_do_cse
标志,默认为 false,您可以使用 GraphConstructorOptions 将其设置为 true。这是使用 GraphConstructorOptions 的 C++ example(抱歉,找不到 Python)
如果这不起作用,您可以 "manual CSE",即找出哪些部分被不必要地重新计算,将其分解为单独的张量,并在所有计算中引用该张量。
是否有一种规范的方法可以重用 TensorFlow 中先前提供的占位符的计算?我的具体用例:
- 同时提供许多输入(使用一个占位符),所有这些都通过网络馈送以获得更小的表示
- 根据这些较小表示的各种组合定义损失
- 一次训练一个批次,其中每个批次使用输入的一些子集,无需重新计算较小的表示
这是代码中的目标,但它是有缺陷的,因为一次又一次地执行相同的计算:
X_in = some_fixed_data
combinations_in = large_set_of_combination_indices
for combination_batch_in in batches(combinations_in, batch_size=128):
session.run(train_op, feed_dict={X: X_in, combinations: combination_batch_in})
谢谢。
在 sess.Run() 调用之间共享计算值的规范方法是使用 Variable
。在这种情况下,您可以设置图形,以便在输入占位符时,它们会计算保存到变量中的表示的新值。图表的一个单独部分读取这些变量来计算损失。如果您需要通过计算表示的图形部分计算梯度,这将不起作用。计算这些梯度将需要重新计算编码器中的每个 Op。
这种事情应该用CSE(公共子表达式消除)自动解决。不确定 TensorFlow 现在支持什么,可能有点参差不齐,但是图形选项有 optimizer_do_cse
标志,默认为 false,您可以使用 GraphConstructorOptions 将其设置为 true。这是使用 GraphConstructorOptions 的 C++ example(抱歉,找不到 Python)
如果这不起作用,您可以 "manual CSE",即找出哪些部分被不必要地重新计算,将其分解为单独的张量,并在所有计算中引用该张量。