私はこの問題の最下部にリンクされているKerasオブジェクト検出モデルを訓練していますが、私の問題はKerasや訓練しようとしている特定のモデル(SSD)ではなく、データはトレーニング中にモデルに渡されます。私の訓練の損失は定期的なスパイクを持っていますか?
はここに私の問題(下の画像を参照)である。 私のトレーニング損失が全体的に減少しているが、それは鋭い通常のスパイクを示しています。
をx軸上の単位訓練されていないエポックを、数十のトレーニングステップ。スパイクは、1390回のトレーニングステップごとに1回正確に発生します。これは、トレーニングデータセット上の1回のフルパスのトレーニングステップ数とまったく同じです。
訓練データセットの各フルパスの後にスパイクが常に発生するという事実は、モデル自体に問題があるのではなく、訓練中にデータが供給されていることを疑う。
トレーニング中にbatch generator provided in the repositoryを使用してバッチを生成しています。私はジェネレータのソースコードをチェックし、各パスの前にトレーニングデータセットをシャッフルしてsklearn.utils.shuffle
を使用します。
私は2つの理由から完全に混乱している:
- トレーニングデータセットは、各パスの前にシャッフルされています。
- this Jupyter notebookのように、私はジェネレータのアドホックデータ拡張機能を使用しています。したがって、データセットは理論的には決して同じパスにならないはずです。すべての拡張はランダムです。
これは、私が損失機能でこのパターンを理解していない理由です。アドホックなデータ補強を使用し、すべてのパスの前にデータセットをシャッフルすることによって、私は基本的にデータセットの任意の構造を破壊しています:与えられたイメージの同じ変換がトレーニング中に2度起こることはほとんどありません。時計作業のようなデータセット上の各フルパスの後に正確にスパイクが発生します。
モデルが実際に何かを学習しているかどうかを確認するためにいくつかのテスト予測を行いました。予測は時間の経過とともに良くなっていきますが、モデルは非常にゆっくりと学習しています。これらのスパイクは1390ステップごとにグラデーションを台無しにしているようです。
これが何であるかに関するヒントは非常に高く評価されています!私は訓練のために上にリンクされた全く同じJupyterノートブックを使用していますが、私が変更した唯一の変数は32から16のバッチサイズです。それ以外のリンクノートには、ここで
モデルを含むリポジトリへのリンクです:
https://github.com/pierluigiferrari/ssd_keras
これはあまりmcveではありませんが、私はこの質問が素敵なダイエットにつながると思います。回答が得られる確率は高くなります:) – DJK
@ djk47463私はそれはほとんどコンパクトな例ではないと思いますが、複雑なオブジェクト検出モデルがあり、その問題がモデルのどの部分にあってもよい場合は、コンパクトな例ですか?とにかく、私はそれを自分で解決しました。結局ケラス特有の問題でした。多分、これはある時点で誰かにとって役に立ちます。 – Alex