2017-05-19 28 views
1

大きなデータセットで単純な多層パーセプトロンモデルを構築しようとしていますが、損失値が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} 

任意の助けいただければ幸いです!どうもありがとうございます!

答えて

1

つ(おそらくそれ以上)、それが動作しない理由:

  1. あなたはスキップされたり不適切にあなたの 入力と出力のをスケーリング機能を適用します。その結果、Tensorflowのデータを処理するのが難しくなります。
  2. 不連続な関数であるReLuを使用すると、問題が発生する可能性があります。 tanhやsigmoidなどの他のアクティベーション機能を試してみてください。
+0

あなたのコメントのためにそんなにありがとう!最後のレイヤーをシグモイドに変更すると、NaNの損失エラーが修正されました。さて、損失額は当初は通常のように見えました(約3600)が、すぐに〜23程度に急減しましたが、これは非常に奇妙です。フィーチャスケーリングの最初の点について詳しく説明できますか?ありがとうございました! – dooder

+0

確かに。異なる規模(例えば、住宅価格x1:~1e6ドル、面積x2:〜10-100m2)で2つの機能が設定されている状況を想像してみてください。スケーリングされていないときは、最適化アルゴリズムが "最急峻な"(ハイパー)サーフェスに戻り、収束しなくなる可能性があります(したがってNaNが可能です)。与えられた例では、このような急な谷を持つ(x1、x2)サーフェスを想像することができます。ここで、フィーチャスケーリング(xi < - (xi-mean(xi))/ std(xi))を適用すると、すべて同じスケールで動作します。あなたはそのポイントを見ますか? – OZ13

+0

ああ、それは異なるユニットの機能を比較する方法を意味しています。スケールされていないときには、最適化関数が急峻なハイパーサーフェスに戻って砦が跳ね返る危険性があるということを理解しているかどうかはわかりません。なぜそれは前後にバウンスするのだろうか? – dooder

0

何らかの理由で、トレーニングプロセスが分岐していて、重みに無限大の値があり、NaNが失われることがあります。理由はたくさんありますが、トレーニングパラメータを変更してみてください(テスト用に小さなバッチを使用してください)。

また、クラシファイアの最終出力にreluを使用するのは、通常の方法ではありません。シグモイドを使用してみてください。

+0

ありがとうございました!最後のレイヤーをシグモイドに変更すると、NaNの損失エラーが修正されました。それにもかかわらず、予測クラスのすべては、いくつかの一定の静止の場合でも[0 0 0 0 0 0]または[5 5 5 5 5]である。ちょうどあなたの訓練プロセスが分岐したとき、あなたはどのように知っていますか?私は、私の損失の価値が時々上下に行くことに気づいた – dooder

0

私が理解しているように、Reluはニューラルネットワークの上限に上限を設けていないので、その実装に応じて解読する可能性が高くなります。

すべてのアクティベーション機能をtanhまたはsigmoidに切り替えてみてください。 Reluは一般にcnnsの畳み込みに使用されます。

また、あなたがε値でどのように影響を与えたのかわからないので、クロスエントロピーによるデコンヴォニングがあるかどうかを判断することも難しいです。残差を使うほうがずっと簡単ですが、それでも効果的です。

また、5000-5000-4500ニューラルネットワークは巨大です。あなたは実際には大きなネットワークを必要とすることはほとんどありません。

+0

コメントありがとうございます!私は活性化機能を変更します。ニューロンの数に関しては、〜4500の出力クラスがあるので、私は5000を持っていました。だから私の信念に基づいて、出力クラスの数より多くのニューロンが存在するはずです。または私は何かを逃していますか?ありがとう! – dooder

+0

隠された層のノード数をnumb_inputsとnumb_outputsの間にすることをお勧めします。 標準フィードフォワードモデルを使用したMNISTデータセットのちょうど逸話的な点として、私はわずか8つの隠れノードを使って91%の精度を得ることができました。 (784個の入力、8個の隠れたノード、10個の出力)、約280個の隠れたノードを持つネットワークを作成するまでは97%の精度を上回ることはできませんでした。 あなたの接続数が指数関数的に増加するため、必要なノードの数が直線的に増加するとは思えません。 IE numb_weights layer_n * layer_n + 1。 – Jjoseph

+0

アレックス・グレイヴスの研究論文がありましたか?それは、ニューロンの数を増やすことは訓練に役立つが、一旦収束すると、元々訓練された数のノードの多くの部分しか必要としないということが述べられている。今はソースを思い出すことはありませんが、できる限り私がそれを掘り出してリンクすることができるかどうかがわかります。 私は800ほどの小さなネットワークで試してみて、精度がまだ低すぎる場合はそこからノードを増やし始めます。あなたのネットはまだ収束していませんか? – Jjoseph

関連する問題