2016-04-29 4 views
1

私は同じTensorflowグラフの中に2つのニューラルネットワーク、NN1とNN2を持っています。私はNN2の重みをNN1の重みで更新する必要があります。そのために私はsession.run([w1_nn2.assign(w1_nn1), w2_nn2.assign(w2_nn1), ...])を実行します。ここで、wi_nnjは重みです。これらの課題はすべて原子的な操作として実行されていますか?Tensorflowでのネットワークウェイトのスレッドセーフクローン作成?

これが当てはまらない場合は、別のスレッドのNN1でapply_gradients()を呼び出している間に、これらの割り当てを1つのPythonスレッドで呼び出しても安全ではないでしょうか?これはスレッドセーフな方法でこれを行う最も簡単な方法でしょうか?

+0

私は自分の質問に対する答えを知っていると思います。私はPythonを使用しているので、マルチスレッドがPythonでどのように機能するのかによって、あるスレッドによって行われた 'apply_gradients'は他のスレッドによって行われた変数割り当てと同時に実行されることはありません。これは、Tensorflowが 'apply_gradients'と割り当てを実行するためにいくつかのスレッドを起動するかもしれませんが、PythonコードはTensorflow操作が終了するまで待つので、そうです。 – nicolas

答えて

1

アトミックではありません。変数のサイズがGBの場合、操作に数秒かかる場合があります。そのような大きなopをアトミックにすることはデフォルトです。また、時にはそれは、そのような変数assign OP here

用として複数のスレッドからsimulatanous更新から保護する様々な変数更新OPS、中のパラメータあります Hogwild

に行ったように、複数のスレッドが同時に同じ変数を更新できるようにすると便利です ​​

+0

ありがとう@YaroslavBulatov。それは理にかなっている。実際、私の質問の文脈はHogwildが使われている論文[深い強化学習のための非同期法](http://arxiv.org/abs/1602.01783)です。それでも、Hogwildの仕組みを完全に理解していないかもしれませんが、別のスレッドがそれらのパラメータをローカルネット(NN2)にコピーしている間に、あるスレッドが共有ネットワーク(NN1)のパラメータを更新すると問題はありませんか?このような場合、更新後、NN2は、新しいパラメータ(すなわち、勾配で更新されたもの)と古いパラメータとの両方の混合を含むことができる。 – nicolas

+0

私はそれがいくつかの条件の下では問題ではないと思っています.Hogwildの論文は、それらの "条件" –

関連する問題