私のプログラムはこれに時々直面します(すべての実行がこれに直面するわけではありません..)、そしてこれに直面した場合、nanによるプログラムクラッシュの前に保存した最後のモデルからこのエラーロードをいつでも再現できます。このモデルから再実行すると、モデルを使用して損失を生成する最初のトレインプロセスは問題ないように見えますが(損失を出力し、問題はありません)、勾配を適用した後、埋め込み変数の値はNanに変わります。
では、nan問題の根本的な原因は何ですか?さらにデバッグする方法がわからないために混乱し、同じデータとパラメータを持つこのプログラムはほとんど正常に実行され、一部の実行中にのみこの問題に直面します。
Loading existing model from: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
Train from restored model: /home/gezi/temp/image-caption//model.flickr.rnn2.nan/model.ckpt-18000
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:245] PoolAllocator: After 5235 get requests, put_count=4729 evicted_count=1000 eviction_rate=0.211461 and unsatisfied allocation rate=0.306781
I tensorflow/core/common_runtime/gpu/pool_allocator.cc:257] Raising pool_size_limit_ from 100 to 110
2016-10-04 21:45:39 Epoch:1.87 train_step:18001 duration:0.947 elapsed:0.947 train_avg_metrics:['loss:0.527'] ['loss:0.527']
2016-10-04 21:45:39 Epoch:1.87 eval_step: 18001 duration:0.001 elapsed:0.948 ratio:0.001
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
W tensorflow/core/framework/op_kernel.cc:968] Invalid argument: Nan in summary histogram for: rnn/HistogramSummary_1
[[Node: rnn/HistogramSummary_1 = HistogramSummary[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"](rnn/HistogramSummary_1/tag, rnn/image_text_sim/image_mlp/w_h/read/_309)]]
Traceback (most recent call last):
File "./train.py", line 308, in <module>
tf.app.run()
トレーニングの最初の反復中に、モデルが単一の予測クラスのみを吐き出す場合があります。偶然に、すべてのトレーニング例でクラスが0であることが判明した場合、カテゴリクロスエントロピー損失のNaN値が存在する可能性があります。
tf.log(predictions + 1e-8)
などの損失を計算するときは、必ず小さな値を導入してください。これは、この数値的不安定性を克服するのに役立ちます。
通常、NaNはモデルの不安定性の兆候であり、たとえば、勾配の爆発です。それは見過ごされているかもしれません、損失はただ縮小を止めるでしょう。重みの要約をログに記録しようとすると、問題が明確になります。最初の対策として、学習率を下げることをお勧めします。それでも問題が解決しない場合は、ここにコードを投稿してください。それを見ずに、もっと具体的なことを提案するのは難しいです。
同様のエラーが発生し、さまざまな学習率、バッチサイズ、損失関数、モデルアーキテクチャを試してみましたが、うまくいきませんでした。しかし、テンソルボードコールバックを使用していなければ、モデルを問題なくトレーニングできることに気付きました。 「要約ヒストグラムのNan」は、モデルの重みヒストグラムを保存することを指しているように見えます。これにより、これらのNanが明示的になります。テンソルボードコールバックでヒストグラムをオフにすると、問題が解決しました:tf.keras.callbacks.TensorBoard(log_dir = log_dir、histogram_freq = 0)
同様の問題が発生しました。私の場合、アクティベーションをtf.nn.reluからtf.nn.sigmoidに変更すると、機能しました。これがお役に立てば幸いです。
システムのメモリ不足と関係があると思います。これは、特定の手順の後にエラーが発生した場合に特に問題になるようです。
trainをfalseにで設定batch_norm(pipeline.configファイル内)はこの問題を克服しているようです。
次のようになります。
batch_norm {
decay: 0.999
center: true
scale: true
epsilon: 0.001
train: false
}
トレーニングディレクトリ(logdir)を削除そしてトレーニングを再開します。最近のチェックポイントから再開すると、同じエラーが発生します。
これがお役に立てば幸いです。