5
TensorFlowランダムシードを同じにしても、私のモデルが訓練されるたびに異なることに気付きました。非決定性勾配計算
私はそれを検証:
- 初期化が決定的です。最初の更新前にウェイトは同じです。
- 入力は確定的です。事実、損失を含む様々な順方向計算は、最初のバッチについては全く同じです。
- 最初のバッチの勾配が異なります。具体的には、
tf.gradients(loss, train_variables)
の出力を比較しています。loss
とtrain_variables
の値は同じですが、変数の一部では勾配が、時にはです。違いは非常に重要です(単一の変数の勾配の絶対値の合計が1より大きい場合があります)。
これは、非決定論を引き起こすのは勾配計算であると結論づけます。 私はthis questionを見て、intra_op_parallelism_thread=1
とinter_op_parallelism_thread=1
のCPUで動作させても問題は解決しません。
フォワードパスがない場合、バックワードパスはどのように非決定論的になりますか?どうすればこれをさらにデバッグできますか?
それが事実だった場合、前方の計算は右、あまりにも違うでしょうか?また、(静的な)シードで、どの接続が切断されるのかを判断するべきではありませんか? – Georg
トレーニング中または評価中に前方計算を意味しますか?通常の方法は、検証時にドロップアウトを無効にすることです。あなたのコードでどのように実装されていますか?そして、はい、ランダムシードは、どの接続が落とされるかを判断する必要があります。おそらくあなたは[this](http://stackoverflow.com/a/36289575/3941813)の質問に似た問題を抱えているでしょう。 – jabalazs
私はトレーニング中に前方計算を意味します。私は 'tf.nn.dropout()'を使っていますが、 'keep_prob == 1 'であっても問題は解決しています。私は、グラフの中には一つのグラフしかインスタンス化されていないことも確認しました( 'tf.Graph()'は実際にはコード内で呼び出されません)。 – Georg