2017-04-24 22 views
0

在tensorflow也許作爲一個典型的訓練循環如下:tensorflow在每次調用compute_gradients()時創建一個新的numpy數組嗎?

cg = opt.compute_gradients(loss) 
grads = [None] * len(cg) 
for gv in cg: 
    grads[i] = gv[0] 
# ... do some process to grads ... 
apply_gradients = opt.apply_gradients(cg) 
while (...): 
    gradients = sess.run(grads) 
    feed = dict() 
    for i, grad_var in enumerate(cg) 
     feed[grad_var[0]] = gradients[i] 
    sess.run(apply_gradients, feed_dict=feed) 

每個調用sess.run(grads)時間,則產生一個新的numpy的陣列gradients(使用新分配的內存儲器)。我想爲所有訓練迭代使用固定的numpy數組,我怎麼能這樣做?

回答

2

tf.Optimizer.compute_gradients()方法不應該創建任何新的NumPy數組:它將生成一個TensorFlow操作圖,用於計算loss關於模型中某些或全部變量的梯度。返回值不是NumPy數組;它是應用梯度的梯度對象tf.Tensor和相應的tf.Variable的列表。

不過,通常在迴路內調用opt.compute_gradients()通常是浪費內存。很難說這是否會在沒有看到更多代碼的情況下正常工作,但是您應該能夠在循環之前將呼叫移動到opt.compute_gradients(),因爲它似乎不依賴循環內計算的任何東西。這將避免在每次循環迭代中構建一個新的TensorFlow圖段,並且應該減少內存成本。

+0

對不起,我的問題還不夠清楚。我編輯它,現在可以給我一些建議嗎?現在在我的代碼中'漸變'是一個numpy的ndarray,每次它是一個新的數組。我是否可以在所有訓練迭代中使用具有固定內存的數組?我怎麼能這樣做? –

+0

我有個主意。我想首先我可以編寫一個python C擴展,它創建一個使用固定內存的numpy數組。然後我們編輯tensorflow的session run()實現,讓它使用我們自己的數組,然後每次執行'sess.run(grads)'時,它都會使用固定的內存。 –

相關問題