Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TensorFlow中的缓存计算_Tensorflow - Fatal编程技术网

TensorFlow中的缓存计算

TensorFlow中的缓存计算,tensorflow,Tensorflow,在TensorFlow中,有没有一种规范的方法可以重用以前提供的占位符中的计算?我的特定用例: 同时提供多个输入(使用一个占位符),所有输入都通过网络提供,以获得更小的表示 根据这些较小表示的各种组合定义损失 一次训练一个批次,每个批次使用一些输入子集,而不重新计算较小的表示 这是代码中的目标,但这是有缺陷的,因为相同的计算会一次又一次地执行: X_in = some_fixed_data combinations_in = large_set_of_combination_indices

在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()调用共享计算值的标准方法是使用
变量。在本例中,您可以设置图形,以便在输入占位符时,占位符会计算保存到变量中的表示形式的新值。图的另一部分读取这些变量以计算损失。如果需要通过图形中计算表示的部分计算渐变,则此操作将不起作用。计算这些梯度将需要重新计算编码器中的每个运算。

这是一种应该用CSE(公共子表达式消除)自动解决的问题。现在不确定TensorFlow中的支持是什么,可能有点参差不齐,但Graph options的
optimizer\u do\u cse
标志默认为false,您可以使用GraphConstructorOptions将其设置为true。下面是一个使用GraphConstructorOptions的示例(很抱歉,找不到Python)


如果这不起作用,你可以做“手动CSE”,也就是说,找出哪个部分被不必要地重新计算,将其分解成单独的张量,并在所有计算中引用该张量。

此外,我需要缓存X,因为从训练中返回的梯度将取决于X。(我会编辑我的帖子,但现在看不到“编辑”选项。)所以你认为没有“正确”的方法可以做到这一点,那就是向前传递一次,缓存那些结果,然后使用这些缓存的结果计算梯度?据我所知,你需要实现你自己版本的tf.gradients,它知道如何重用存储在变量中的值。