Kerasの損失とメトリックの値がそれぞれの同じ関数と一致しません

Aug 18 2020

私は以下のようなカスタム損失関数でケラを使用しています:

def custom_fn(y_true, y_pred):
   # changing y_true, y_pred values systematically
   return mean_absolute_percentage_error(y_true, y_pred)
   

それから私は電話model.compile(loss=custom_fn)してmodel.fit(X, y,..validation_data=(X_val, y_val)..)

Kerasは、保存されたlossval_lossモデル履歴インチ 健全性チェックとして、モデルがトレーニングを終了したときに使用しているmodel.predict(X_val)のでcustom_fn、トレーニング済みモデルを使用して検証損失を手動で計算できます。

このコールバックを使用して、最良のエポックでモデルを保存しています。

callbacks.append(ModelCheckpoint(path, save_best_only=True, monitor='val_loss', mode='min'))

したがって、これを計算した後、検証損失val_lossは、最良のエポックのkerasの値と一致する必要があります。しかし、これは起こっていません。

この問題を理解するための別の試みとして、私もこれを行っています:

    model.compile(loss=custom_fn, metrics=[custom_fn])

そして、私の驚きに、val_lossそしてval_custom_fn(いずれも一致していないlossか、loss_custom_fnそのことについては)を。

これは本当に奇妙なことです。私のものcustom_fnは本質的にkerasに組み込まれmapeていてy_truey_predわずかに操作されています。ここで何が起こっているのですか?

PS:私が使用しているLSTMレイヤーはレイヤーと最後のDenseレイヤーです。しかし、この情報は問題とは関係がないと思います。また、ハイパーパラメータとして正則化を使用していますが、ドロップアウトは使用していません。

更新

次のような損失関数およびメトリックとしてcustom_fn組み込まれmapeているkerasを削除して使用することもできます。

model.compile(loss='mape', metrics=['mape'])

簡単にするために、ModelCheckpointコールバックを削除しても同じ効果があります。val_lossそしてval_mape、各エポックは同等ではありません。これは私には非常に奇妙です。何かが足りないか、Kerasコードにバグがあります。前者の方が現実的かもしれません。

回答

3 user7331538 Aug 18 2020 at 19:34

このブログ投稿は、検証損失を計算するときに、kerasがトレーニングで使用される正則化を追加することを示唆しています。そして明らかに、選択したメトリックを計算するとき、正則化は適用されません。これが、質問で述べられているように、選択した損失関数で発生する理由です。

これは、Kerasからドキュメントを見つけることができなかったものです。ただし、すべての正則化ハイパーパラメータを削除すると、val_lossval_custom_fnは各エポックで正確に一致するため、持ちこたえているようです。

簡単な回避策はcustom_fn、をメトリックとして使用val_custom_fnし、val_loss。よりもメトリック()に基づいて最適なモデルを保存することです。または、各エポックを手動でループし、各エポックをval_lossトレーニングした後、正しい手動で計算します。custom_fnメトリックと損失関数の両方を含める理由がないため、後者の方が理にかなっているようです。

誰かがKerasのドキュメントでこれの証拠を見つけることができれば、それは役に立ちます。