2017-03-06 60 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