1. ホーム
  2. python

[解決済み] ディープラーニングによるナン損失の理由

2022-09-01 11:44:21

質問

あまりに一般的な質問かもしれませんが、何が畳み込みニューラルネットワークを発散させるのか、どなたか説明できますか?

具体的には

Tensorflowのiris_trainingモデルを私自身のデータで使用していますが、次のような結果が出続けています。

ERROR:tensorflow:モデルは損失=NaNで発散しました。

トレースバック...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: 学習中にNaN損失が発生しました。

トレースバックはこの行から始まりました。

 tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                        hidden_units=[300, 300, 300],
                                        #optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),                                                          
                                        n_classes=11,
                                        model_dir="/tmp/iris_model")

オプティマイザーを調整したり、学習率に0を使ったり、オプティマイザーなしを使ったりしてみました。ネットワーク層、データ サイズなどについての洞察があれば、教えてください。

どのように解決するのですか?

モデルが発散しているのを見たことがあるのですが、どうすればいいのでしょうか?

  1. 学習速度が高すぎる。 損失が増加し始め、その後無限大に発散する場合、このケースかどうかがよくわかります。

  2. 私は DNNClassifier についてあまり詳しくはありませんが、カテゴリ クロス エントロピーのコスト関数を使用していると思われます。 これは、予測がゼロに近づくと発散する予測値のログを取ることを含みます。 そのため、この発散を防ぐために、通常は予測値に小さなイプシロン値を追加します。DNNClassifierはおそらくこれを行うか、そのためにtensorflowのoppを使用するのだと思います。 おそらく問題ではありません。

  3. 他の数値的安定性の問題は、イプシロンを追加することで助けることができるゼロによる除算のように存在することができます。 もう 1 つのあまり明白ではない問題は、有限精度の数字を扱うときに適切に簡略化されないと発散する可能性がある平方根です。しかし、DNNClassifierの場合、これが問題であるとは思えません。

  4. 入力データに問題がある可能性があります。 試しに assert not np.any(np.isnan(x)) を呼び出して、ナンを導入していないことを確認してください。 また、ターゲット値がすべて有効であることを確認してください。 最後に、データが適切に正規化されていることを確認してください。おそらく、[0, 255]ではなく、[-1, 1]の範囲にピクセルを持ちたいのでしょう。

  5. ラベルは損失関数のドメイン内になければならないので、対数ベースの損失関数を使用する場合、すべてのラベルは非負でなければなりません (evan pu と以下のコメントによって指摘されたように)。