[解決済み] 早期停止に必要なパラメータは何ですか?
質問
プロジェクトでKerasを使ってニューラルネットワークを学習しています。Kerasにはearly stoppingという関数があります。早期停止を使用してニューラルネットワークがオーバーフィットしないようにするには、どのようなパラメータを観測すればよいか教えてください。
どのように解決するのですか?
早期停止とは、基本的に損失が増え始めたら(言い換えれば検証精度が下がり始めたら)学習を停止することです。以下は ドキュメント によると、以下のように使用されます。
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
値は実装(問題、バッチサイズなど)に依存しますが、一般的にオーバーフィッティングを防ぐために使用します。
-
検証の損失を監視する (クロス検証を使用する必要があります。
を設定することで、検証損失を監視する(クロスバリデーションか、少なくともトレーニング/テストセットを使用する必要がある)。
monitor
引数を'val_loss'
. -
min_delta
は、あるエポックでの損失を改善として定量化するかどうかの閾値です。 改善されたかどうかを判断するための閾値です。もし損失の差がmin_delta
を下回る場合、それは改善なしと定量化される。 を下回る場合、改善なしと定量化されます。我々は、損失がどのように悪化するかに興味があるため、0としておく方が良い。 のままにしておくのがよいでしょう。 -
patience
引数は、損失が増加し始めたら (改善が止まったら) 停止するまでのエポック数を表します。 これは実装に依存し、もし 非常に小さなバッチ を使うか、あるいは 大きな学習率 損失 ジグザグ (精度はよりノイズが多くなります)。 大きなpatience
の引数を大きくしてください。もし ラージバッチ を指定し 小さい 学習率 を使用すると、損失がより滑らかになるため、より小さな より小さいpatience
の引数になります。いずれにせよ、私は2としておきます。 モデルにより多くのチャンスを与えます。 -
verbose
は何を印刷するかを決定します。デフォルト(0)のままにしておきます。 -
mode
引数は、監視する量がどのような方向性を持っているかに依存します。 があるか(減っているのか増えているのか)によりますが、私たちは損失を監視しているので、この引数はmin
. しかし、kerasに任せましょう が処理してくれるので、それをauto
ということで、このようなものを使って、早期停止をした場合としない場合の誤差損失をプロットして実験してみたいと思います。
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
コールバックがどのように機能するかについて曖昧な可能性があるため、もう少し説明します。一度
fit(... callbacks=[es])
を呼び出すと、Kerasは与えられたコールバックオブジェクトにあらかじめ決められた関数を呼び出します。これらの関数は
on_train_begin
,
on_train_end
,
on_epoch_begin
,
on_epoch_end
と
on_batch_begin
,
on_batch_end
. 早期停止コールバックはエポック終了毎に呼び出され、監視された最良の値と現在の値を比較し、条件が満たされた場合に停止します(最良の監視値の観測から何エポック経過したか、それは忍耐の引数より大きいか、最後の値との差はmin_deltaより大きいか、等々)。
コメントで@BrentFaustが指摘したように、モデルの学習はEarly Stopping条件を満たすか
epochs
パラメータ (デフォルト=10) が
fit()
を満たす必要があります。早期停止コールバックを設定することで、モデルをその
epochs
パラメータを越えてモデルを訓練することはない。そのため
fit()
関数をより大きな
epochs
の値が大きい場合、Early Stoppingコールバックの恩恵をより多く受けられるでしょう。
関連
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。