2016-04-29 52 views
1

我有兩個神經網絡,NN1和NN2,在同一個Tensorflow圖中。我需要用NN1的權重來更新NN2的權重。爲此我執行session.run([w1_nn2.assign(w1_nn1), w2_nn2.assign(w2_nn1), ...]),其中wi_nnj是權重。所有這些任務都是作爲原子操作來執行的嗎?Tensorflow中線程安全克隆網絡權重?

如果情況並非如此(如我懷疑的那樣),在另一個線程中調用NNN上的apply_gradients()時,在一個Python線程中調用這些分配並不安全,對吧?那麼以線程安全的方式執行此操作最簡單的方法是什麼?

+0

我想我知道我自己的問題的答案。由於我使用Python,並且由於多線程如何在Python中工作,一個線程完成的'apply_gradients'將不會與另一個線程完成的變量分配同時執行,對嗎?即使Tensorflow可能會啓動多個線程來執行'apply_gradients'和賦值,因爲Python代碼將等待任何Tensorflow操作完成,對吧? – nicolas

回答

1

它不是原子的。如果你的變量是GB的大小,這個操作可能需要幾秒鐘的時間,所以默認這樣的大操作是原子的很奇怪。此外,有時它是有用的,允許多個線程同時更新相同的變量,如Hogwild

有各種變量更新OPS從simulatanous更新來保護從多個線程,如可變assignhere

參數完成 ​​
+0

謝謝@YaroslavBulatov。這說得通。事實上,我的問題的背景是使用Hogwild的論文[Deep Reinforcement Learning異步方法](http://arxiv.org/abs/1602.01783)。儘管如此,我可能並不完全理解Hogwild是如何工作的,但如果一個線程更新共享網絡(NN1)的參數,而另一個線程將這些參數複製到其本地網絡(NN2),這將不會成爲問題?如果發生這種情況,更新後,NN2可能包含兩個新參數(即用漸變更新)和舊參數的混合。 – nicolas

+0

我想這在某些情況下不是問題,Hogwild紙張有更多關於這些「條件」是什麼的細節 –