2017-03-06 57 views
0

我有具有一系列计算如下假想曲线图:如何在不再需要时释放张量?

a_0 = tf.placeholder() 
a_1 = some_op_1(a_0) 
a_2 = some_op_2(a_1) 
a_3 = some_op_3(a_2) 

观察到计算a_3时; a_0a_1不需要,因此可以在为a_3分配内存之前丢弃它们。有什么办法可以要求TensorFlow执行这种内存优化(同意有一些时间成本)?

请注意,这与this有关仅在需要时分配内存的问题不一样。

编辑:这个网络不会被训练,所以不要担心backprop。

+2

它是自动完成的 - 在'a_3'计算开始的时候,TensorFlow已经放弃了'a_0'和'a_1'。您可以使用https://github.com/yaroslavvb/memory_util查看内存分配/释放的时间表来验证这确实是这种情况 –

回答

1

TensorFlow使用引用计数来释放张量不再使用时所用的内存。 a_0a_1的值将在没有更多引用时立即删除,并且在TensorFlow的最新版本(1.0版后夜版本)中,如果某些操作具有相同的输入缓冲区形状和元素类型。

+0

我猜这是由于[203a4d98](https://github.com/tensorflow/tensorflow/commit/203a4d98)?对于只向前网络来说,ReLU是最相关的一个,如果在那里发生重用,那将会很好。 –

+1

是的,它适用于所有一元和二元元素操作(包括ReLU)以及其他一些操作。 – mrry

+0

对不起。我问了这个问题,因为当我给卷积网络提供双倍期望的图像大小时,我得到了OOM错误。我认为这是由于上述原因。我会用@YaroslavBulatov的脚本仔细检查我的记忆计算。 – Priyatham