106

260,000 行 35 列の「ワンホット エンコーディング」(すべて 1 と 0) のデータ マトリックスがあります。Keras を使用して単純なニューラル ネットワークをトレーニングし、連続変数を予測しています。ネットワークを作成するコードは次のとおりです。

model = Sequential()
model.add(Dense(1024, input_shape=(n_train,)))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(1))

sgd = SGD(lr=0.01, nesterov=True);
#rms = RMSprop()
#model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy'])
model.compile(loss='mean_absolute_error', optimizer=sgd)
model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, verbose=1, validation_data=(X_test,Y_test), callbacks=[EarlyStopping(monitor='val_loss', patience=4)] )

ただし、トレーニング プロセス中は損失が適切に減少することがわかりますが、2 番目のエポックの途中で nan になります。

Train on 260000 samples, validate on 64905 samples
Epoch 1/3
260000/260000 [==============================] - 254s - loss: 16.2775 - val_loss:
 13.4925
Epoch 2/3
 88448/260000 [=========>....................] - ETA: 161s - loss: nan

RMSPropの代わりにを使用してみました 、の代わりにSGD試しました 、ドロップアウトの有無にかかわらず試しましたが、すべて無駄でした。私は小さなモデル、つまり隠れ層が 1 つしかないモデルで試してみましたが、同じ問題が発生しました (別の時点で nan になります)。ただし、少ない機能、つまり 5 列しかない場合でも機能し、非常に優れた予測が得られます。なんらかのオーバーフローがあるように見えますが、その理由は想像できません。損失は不当に大きくはありません。 tanhrelu

Python バージョン 2.7.11、Linux マシンで実行、CPU のみ。Theano の最新バージョンでテストしましたが、Nans も取得したので、Theano 0.8.2 に行ってみましたが、同じ問題が発生しました。最新バージョンの Keras には同じ問題があり、バージョン 0.3.2 でも同様です。

4

23 に答える 23

58

1インチの答えはかなり良いです。しかし、すべての修正は問題を直接ではなく間接的に修正しているようです。特定の値を超えるグラデーションをクリップするグラデーションクリッピングを使用することをお勧めします。

Keras ではclipnorm=1( https://keras.io/optimizers/を参照) を使用して、1 を超えるノルムですべてのグラデーションを単純にクリップできます。

于 2016-11-26T23:07:01.937 に答える
45

以前も同じ問題に直面しました。この質問と回答を検索して見つけます。上記のすべてのトリックは、ディープ ニューラル ネットワークのトレーニングに重要です。私はそれらをすべて試しましたが、それでもNANを取得しました。

この質問もここにあります。https://github.com/fchollet/keras/issues/2134 . 著者の要約を次のように引用しました:

将来この問題が発生する可能性のある他の人のためにアーカイブされるように、これを指摘したかった. トレーニングプロセスに入った後、突然 nan を返す損失関数に遭遇していました。レルス、オプティマイザー、損失関数、レルスに応じたドロップアウト、ネットワークのサイズ、ネットワークの形状を確認しました。私はまだ損失を出していて、最終的にナンになり、かなりイライラしていました.

それからそれは私に夜明けをもたらしました。私のインプットが悪いのかもしれません。結局のところ、私が CNN に渡していた (そして平均値の正規化を行っていた) 画像の 1 つは 0 にすぎませんでした。平均を差し引いて標準偏差で正規化したときに、このケースをチェックしていなかったため、ナンだけの見本の行列になりました。正規化関数を修正すると、ネットワークは完全にトレーニングされるようになりました。

上記の観点に同意します。入力はネットワークに敏感です。私の場合、密度推定のログ値を入力として使用します。絶対値は非常に大きくなる可能性があり、勾配のいくつかのステップの後に NaN になる可能性があります。入力チェックは必要だと思います。まず、入力に-inf や inf、または絶対値に非常に大きな数値が 含まれていないことを確認する必要があります。

于 2017-01-07T03:04:26.117 に答える
2

ケラスを使用して同様の問題がありました。2回目のバッチが投入された後、損失はNANに変わりました。

私がしようとしました:

  1. 出力密層の活性化としてソフトマックスを使用する
  2. 入力に ​​nan をドロップします
  3. 入力を正規化する

しかし、それはうまくいきませんでした。それで、私はしようとしました:

  1. 学習率を下げる

問題が解決しました。

于 2019-10-24T08:26:45.080 に答える