大きなデータセットで単純な多層パーセプトロンモデルを構築しようとしていますが、損失値がnanになっています。奇妙なことは、最初の訓練ステップの後、損失値はナノではなく、約46である(これは奇妙なことです。ロジスティック回帰モデルを実行すると、最初の損失値は約3600です)。しかし、その直後には、損失額は常にナノです。私はtf.printを使ってそれを試してみました。Tensorflowニューラルネットワークの損失値NaN
このモデルの目的は、〜4500の異なるクラスを予測することです。そのため、分類の問題です。 tf.printを使用すると、最初のトレーニングステップ(またはMLP経由のフィードフォワード)の後に、最後に完全に接続されたレイヤーから出てくる予測が正しいように見えます(1から4500までのすべての数値が変わります)。しかし、その後、最後に完全に接続された層からの出力は、すべて0または他の一定の数(0 0 0 0 0)のいずれかになります。
3層モデル:私のモデルに関するいくつかの情報については
。すべて完全に接続されたレイヤー。
- CrossEntropyLossを使用して0.001(私も0.1と0.01を試みたが、何も変わっていない)
の割合を学ぶ1000年
の
バッチサイズ(私はlog0を防ぐために、イプシロン値を追加しました)レート崩壊学習AdamOptimizer
を使用して
は0.95
です
モデルの正確なコードは以下の通りです:(私はTF-スリムライブラリを使用しています)
input_layer = slim.fully_connected(model_input, 5000, activation_fn=tf.nn.relu)
hidden_layer = slim.fully_connected(input_layer, 5000, activation_fn=tf.nn.relu)
output = slim.fully_connected(hidden_layer, vocab_size, activation_fn=tf.nn.relu)
output = tf.Print(output, [tf.argmax(output, 1)], 'out = ', summarize = 20, first_n = 10)
return {"predictions": output}
任意の助けいただければ幸いです!どうもありがとうございます!
あなたのコメントのためにそんなにありがとう!最後のレイヤーをシグモイドに変更すると、NaNの損失エラーが修正されました。さて、損失額は当初は通常のように見えました(約3600)が、すぐに〜23程度に急減しましたが、これは非常に奇妙です。フィーチャスケーリングの最初の点について詳しく説明できますか?ありがとうございました! – dooder
確かに。異なる規模(例えば、住宅価格x1:~1e6ドル、面積x2:〜10-100m2)で2つの機能が設定されている状況を想像してみてください。スケーリングされていないときは、最適化アルゴリズムが "最急峻な"(ハイパー)サーフェスに戻り、収束しなくなる可能性があります(したがってNaNが可能です)。与えられた例では、このような急な谷を持つ(x1、x2)サーフェスを想像することができます。ここで、フィーチャスケーリング(xi < - (xi-mean(xi))/ std(xi))を適用すると、すべて同じスケールで動作します。あなたはそのポイントを見ますか? – OZ13
ああ、それは異なるユニットの機能を比較する方法を意味しています。スケールされていないときには、最適化関数が急峻なハイパーサーフェスに戻って砦が跳ね返る危険性があるということを理解しているかどうかはわかりません。なぜそれは前後にバウンスするのだろうか? – dooder