TensorFlow中的缓存计算
在TensorFlow中,有没有一种规范的方法可以重用以前提供的占位符中的计算?我的特定用例:TensorFlow中的缓存计算,tensorflow,Tensorflow,在TensorFlow中,有没有一种规范的方法可以重用以前提供的占位符中的计算?我的特定用例: 同时提供多个输入(使用一个占位符),所有输入都通过网络提供,以获得更小的表示 根据这些较小表示的各种组合定义损失 一次训练一个批次,每个批次使用一些输入子集,而不重新计算较小的表示 这是代码中的目标,但这是有缺陷的,因为相同的计算会一次又一次地执行: X_in = some_fixed_data combinations_in = large_set_of_combination_indices
- 同时提供多个输入(使用一个占位符),所有输入都通过网络提供,以获得更小的表示
- 根据这些较小表示的各种组合定义损失
- 一次训练一个批次,每个批次使用一些输入子集,而不重新计算较小的表示
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()调用共享计算值的标准方法是使用
变量。在本例中,您可以设置图形,以便在输入占位符时,占位符会计算保存到变量中的表示形式的新值。图的另一部分读取这些变量以计算损失。如果需要通过图形中计算表示的部分计算渐变,则此操作将不起作用。计算这些梯度将需要重新计算编码器中的每个运算。这是一种应该用CSE(公共子表达式消除)自动解决的问题。现在不确定TensorFlow中的支持是什么,可能有点参差不齐,但Graph options的optimizer\u do\u cse
标志默认为false,您可以使用GraphConstructorOptions将其设置为true。下面是一个使用GraphConstructorOptions的示例(很抱歉,找不到Python)
如果这不起作用,你可以做“手动CSE”,也就是说,找出哪个部分被不必要地重新计算,将其分解成单独的张量,并在所有计算中引用该张量。此外,我需要缓存X,因为从训练中返回的梯度将取决于X。(我会编辑我的帖子,但现在看不到“编辑”选项。)所以你认为没有“正确”的方法可以做到这一点,那就是向前传递一次,缓存那些结果,然后使用这些缓存的结果计算梯度?据我所知,你需要实现你自己版本的tf.gradients,它知道如何重用存储在变量中的值。