我有一个很大的张量,计算成本很高,但实际上我只需要每10次迭代重新计算一次(在梯度下降期间)。最好的方法是什么?
更具体地说:
假设每次运行intermediate_tensor
时我都会使用final_tensor
计算tf.Session
。在我的例子中,final_tensor
是一组用于优化的修改渐变。可以定义包含intermediate_tensor
和final_tensor
的图表。但是,当intermediate_tensor
变化缓慢时,运行此图表效率会很低。在伪代码中,这就是我想要做的事情:
intermediate_tensor = tf.some_operation(earlier_variable)
final_tensor = tf.matmul(intermediate_tensor, other_earlier_variable)
with tf.Session() as sess:
# pretending `partial_run` works like I want it to:
sess.partial_run(intermediate_tensor, feed_dict = {})
for i in range(5):
ft = sess.partial_run(final_tensor, feed_dict = {})
print(ft)
实验partial_run
功能几乎我正在寻找的东西。但是,只有在我每次评估partial_run
时,我只想评估一次final_tensor
时,才能使用intemediate_tensor
。它不适用于for循环。
我目前的解决方法是使用tf.placeholder
。我在对intermediate_tensor
的一次调用中评估sess.run
,然后将结果反馈给sess.run
作为占位符的新调用。但是,这非常不灵活。例如,它要求我在编译时对变量形状进行硬编码。当我想要使用的中间变量的数量非常大时,它也不是很好。
有更好的方法吗?例如,如果一个人使用的曲率矩阵不需要在每次迭代时进行评估,那么这将非常有用。