最初の分類子のトレーニング プロセス (損失曲線を見て、問題について考えます)

Xiaobai のレコード ポスト、プロセス全体でいくつかの正しいか間違っている orz。. .

分類器は resnet50 をバックボーンとして使用します. これに基づいて、2048 次元の出力が最初に 512 次元にマッピングされ、次に 512 次元が 40 のカテゴリの 32 次元の埋め込みになり、40 の 1 次元のスコアになります。 Bx40x32 埋め込みと Bx40 ロジットに連結 ; celebahq のデータ セットを使用して実行: 27,000 画像をトレーニング セットとして、3,000 画像を検証セットとして; 100 エポックをトレーニングします。

ラウンド1

超参:learning_rate=0.001,batch_size=4,test_batch_size=2

※test_batch_sizeが単体で出てくるとは知らなかったので、前回の実験ではbatch_size(つまりtrain_batch_size)だけ変えました

q 実験結果: 写真に示されているように、トレイン ロスは非常に不安定であり、テスト ロスは epoch30 から上昇しています.テスト ロスはトレイン ロスほど低くはないと思っていましたが、上昇し始めました.これはオーバーフィッティングですか? すでにですか?

オーバーフィッティングだとしたら、バックボーン以降に追加したレイヤーのパラメータが大きいからでしょうか?ネットワーク モデルを変更し、ロジットに BN のレイヤーを追加しました。クラスで、正規化はオーバーフィッティングを防ぐための操作の 1 つだと言ったからです。変更後、2 回目の実験が行われました。

ラウンド2

超参:learning_rate=0.001,batch_size=4,test_batch_size=2

* ハイパーパラメータは変更されていません

実験結果: OMG なぜ列車の損失が下がらないのですか? 最初の実験ほど低くはないのですか? オーバーフィッティングからアンダーフィッティングに変更するために小さな変更を加えた可能性はありますか?

 辛い経験ですが、ネットワークモデルの変更に二度と直面したくないので、まずスーパーパラメータを見てみましょう。まず、学習率とbatch_sizeを減らしてみました:

ラウンド 3

超参:learning_rate=0.0007,batch_size=2,test_batch_size=2

実験結果: 今回は、100 エポックの実行が終了するのを待たずにプログラムを強制終了しました。

私は姉に助けを求めに行きました.姉は私にbatch_sizeを増やしてみるように頼みました,彼女は分類器のトレーニングにそのような小さなbatch_sizeを使用したことがなかったので.彼女は32を使用しました.カードがいっぱいで、始めたいです 32 を使ってみてください。グラフィックス カードの使用率は 67% です。

ラウンド 4

超参:learning_rate=0.001,batch_size=32,test_batch_size=2

※はい、今回はtest_batch_sizeも抜けています

実験結果: 元の曲線に戻って、コンピュータの前でぼんやりと立っています...とにかく、batch_size が大きくなるにつれて、列車の損失はよりスムーズになります。

 この時点で、test_batch_size が変更されていないことがわかったので、batch_size と一致するように変更しようとしました。

ラウンド5

超参:learning_rate=0.001,batch_size=32,test_batch_size=32

実験結果:卵は以前のものと変わらなかった. . .

 学習率のみを調整してみてください。

ラウンド6

超参:learning_rate=0.0005,batch_size=32,test_batch_size=32

テスト損失曲線の上昇はそれほど明白ではありませんが! 2 つの損失曲線はあまり落ちませんね。有線です!より大きな学習率を試す:

ラウンド7

超参:learning_rate=0.0015,batch_size=32,test_batch_size=32

 このテストの損失の増加傾向は私を怖がらせるので、実行を終了する前にそれを殺します.学習率を下げる方が良いようです. 前回は 0.0005 に調整されていましたが、今度は 0.0001 に小さくしてみてください。

ラウンド 8

超参:learning_rate=0.0001,batch_size=32,test_batch_size=32

 曲線は、学習率が 0.0005 に等しい場合に似ていますが、テストの損失はラウンド 6 よりも数値的に優れています。ログファイルに移動して正解率を確認してください. 実際, エポックにおける上記の実験のほとんどのテスト正解率は約 89 であり, これはあまり変化していません. 初めて, ラウンド 8 は正解率 90 を維持しました.エポック 100 のポイント。次に、ラウンド 8 を最良のモデルとして選択します。

⬆0401 初期記録


⬇0407更新

教官に報告したところ、教官は無言で、電車のロスが増えたり動かなくなったりしたら、走り続けて電気を浪費するのではなく、プログラムを終了させた方がいいと言われました、涙..

ユン先生: ラウンド 4 の場合、モデルを保存して epoch14 あたりで停止し、モデルをロードして、より少ない学習率でトレーニングを続けることができます。

試しに行って、上記の方法を使用して学習率トレーニングを 0.0001 に変更しました。

ラウンド 9

 この適切なオーバーフィッティングの傾向は理解できますが、今回はインストラクターの環境主義の概念を実装するのに間に合うようにそれを殺します。

学習率が小さすぎませんか? 今回は、0.0004 を大きくしてみます。

ラウンド10

 逃れられない…オーバーフィットの宿命。


⬇0501更新

曲線は見栄えが悪いですが、検証セットの正解率が 89 ~ 90 であることは悪くないので、メインの実験として使用できると思いましたが、結果は良くありません。分類器の埋め込みは非常に小さく、制約の役割を果たすことはできません。!

以前のモデルは古すぎて適合しませんでした.ネットワークが深すぎてパラメータが多すぎる疑いがありますか?

最初に、追加したレイヤーを変更して、2048-512-32-1 のマッピング プロセスを 2048-64-16-1 に変更してみますが、卵ではありません。0.001 を使用して最初に学習し、同時にオーバーフィットすることを学習します。位置、および変更 0.0001 の小さな分解能テスト損失は増加するだけで、減少しません。

そこで、resnet50 を変更して alexnet を使用し (インストラクターは alexnet で十分だと言いました)、alexnet の FC の最後の 3 つの層を 9216-4096-4096-512 に変更し、さらに 512-32-1 に続けて、 40 の属性分類による埋め込み。

ラウンド1

左:lr=0.001,bs=32

右:lr=0.0005,bs=32

 右側の曲線の値が低いので、左側を削除して、lr0.0005 のみで実験を実行しました。

ラウンド2

 同時に、lr が低いほど良いかどうかを検討し、bs を動かしたかったので、lr0.0003、bs16 の実験を設定しました。

左:lr=0.0005,bs=32

右:lr=0.0003,bs=16

 

 ちょうど... ほとんど、列車損失とテスト損失は低下せず、同時に epoch50 あたりで上昇しましたか? かすかな。. .

ラウンド3

Round2 の右側にある epoch50 のトレーニングのモデル パラメーターを取得し、学習率 0.0001、bs32 でトレーニングを続けてみてください。左の図に示すように、曲線は非常に振動していますが、減少しています。

同時に、学習率を手動で調整するのも面倒なので、右の図のように、スケジューラー コサイン アニーリングを追加してみてください。

 

おすすめ

転載: blog.csdn.net/qq_43522986/article/details/123864192