畳み込みニューラルネットワークのオーバーフィッティング。ドロップアウトが役に立たない


16

私はconvnetsで少し遊んでいます。具体的には、猫または犬(それぞれ12500)としてラベル付けされた25000個の画像で構成されるkaggle cats-vs-dogsデータセットを使用しています。

テストセットで約85%の分類精度を達成できましたが、90%の精度を達成するという目標を設定しました。

私の主な問題は過剰適合です。どういうわけか、それは常に起こることになります(通常、エポック8-10の後)。私のネットワークのアーキテクチャは、VGG-16に大まかに触発されています。具体的には、画像のサイズを128x128x3に変更し、次に実行します。

Convolution 1 128x128x32 (kernel size is 3, strides is 1)
Convolution 2 128x128x32 (kernel size is 3, strides is 1)
Max pool    1 64x64x32   (kernel size is 2, strides is 2)
Convolution 3 64x64x64   (kernel size is 3, strides is 1)
Convolution 4 64x64x64   (kernel size is 3, strides is 1)
Max pool    2 32x32x64   (kernel size is 2, strides is 2)
Convolution 5 16x16x128  (kernel size is 3, strides is 1)
Convolution 6 16x16x128  (kernel size is 3, strides is 1)
Max pool    3 8x8x128    (kernel size is 2, strides is 2)
Convolution 7 8x8x256    (kernel size is 3, strides is 1)
Max pool    4 4x4x256    (kernel size is 2, strides is 2)
Convolution 8 4x4x512    (kernel size is 3, strides is 1)
Fully connected layer 1024 (dropout 0.5)
Fully connected layer 1024 (dropout 0.5)

最後のレイヤーを除くすべてのレイヤーには、アクティベーション関数としてのreluがあります。

畳み込みのさまざまな組み合わせを試したことに注意してください(単純な畳み込みから始めました)。

また、画像をミラーリングすることでデータセットを拡張したため、合計で50000個の画像があります。

また、最小最大正規化を使用して画像を正規化します。Xは画像です

X=X0/2550

コードはテンソルフローで記述されており、バッチサイズは128です。

トレーニングデータのミニバッチは過剰に適合し、100%の精度になりますが、検証データは約84〜85%で学習を停止するようです。

また、ドロップアウト率を増減しようとしました。

使用されているオプティマイザーは、学習率0.0001のAdamOptimizerです

現時点では、この3週間この問題に取り組んでおり、85%が私の前に障壁を置いているようです。

記録のために、私は転移学習を使用してはるかに高い結果を達成できることを知っていますが、このネットワークを自己学習体験として構築することに興味があります。

更新:

異なるバッチサイズで同じネットワークを実行していますが、この場合ははるかに小さいバッチサイズ(128ではなく16)を使用しており、これまでのところ87.5%の精度(85%ではなく)を達成しています。とは言っても、ネットワークはとにかく過剰に適合します。それでも、ユニットの50%のドロップアウトがどのように役立っていないかはわかりません...明らかに、ここで何か間違ったことをしています。何か案は?

アップデート2:

問題はバッチサイズに関係しているようです、小さいサイズ(128ではなく16)のように、テストセットで92.8%の精度を達成していますが、小さいバッチサイズではネットワークはまだ適合していません(ミニバッチただし、100%の精度で)、損失(エラー)は減少し続け、一般的に安定しています。短所は実行時間が非常に遅くなりますが、待つだけの価値はあります。


2
過剰適合の評価に関する詳細を教えてください。たとえば、トレーニングの精度と検証結果の相違に加えて、検証の精度はどの時点でも低下しますか?損失関数はどうですか?
ニールスレーター

良い質問です。つまり、過剰適合とは、列車内のミニバッチが100%の精度と0.08の損失を達成する一方で、検証が0.35未満になることはなく、その精度は88%のままであることを意味します。検証によれば、それは低下しないように見えます(少なくともあまり大きくありません)、フラットになるようですが、なぜ検証がまだ遠く離れている間にミニバッチがこのような低損失を達成するのでしょうか?
フアンアントニオゴメスモリアーノ

答えはわかりませんが、この振る舞い-列車と検証の間の大きな相違はありますが、それでもOKのような安定した検証-は何度か見たことがあります。場合によってはテスト結果が許容範囲内であるため、過剰適合と呼ぶのをほとんどためらっています。
ニールスレーター

「それでも、ユニットの50%のドロップアウトがどのように役立っていないのか理解していません」私は、成功するドロップアウトのはるかに高い価値を使っている人々を見てきました。
リカルドクルス

回答:


14

わかりましたので、多くの実験の後、私はいくつかの結果/洞察を得ることができました。

そもそも、すべてが等しい場合、トレーニングセット内の小さいバッチは、ネットワークの一般的なパフォーマンスを向上させるために非常に役立ちます。マイナス面として、トレーニングプロセスが非常に遅くなります。

第二に、データは重要であり、ここでは新しいことではありませんが、この問題と闘いながら学んだように、より多くのデータが常に少し役立つようです。

第三に、ドロップアウトは、大量のデータと多数の反復がある大規模なネットワークで役立ちます。私のネットワークでは、完全に接続された最後のレイヤーのみにドロップアウトを適用し、畳み込みレイヤーはドロップアウトを適用しませんでした。

4番目のポイント(これは私が何度も学んでいることです):ニューラルネットワードは、優れたGPUでもトレーニングにLOTを使用します(非常に高価なNVIDIAカードを使用するfloydhubでこのネットワークをトレーニングしました)。そのため、PATIENCEが重要です。

最終的な結論:バッチサイズはより重要であり、バッチが大きくなるとローカルミニマムに到達しやすくなると思われます。

私が書いたコードはPythonノートブックとして利用できます、私はそれがきちんと文書化されていると思います

https://github.com/moriano/loco-learning/blob/master/cats-vs-dogs/cats-vs-dogs.ipynb


調査結果を投稿していただきありがとうございます。簡単な質問:同様の問題に直面していますNOTE USE EITHER mean centering or min-max, NOT BOTH。投稿したノートブックでこれを見ました:。現在、input_fn(Tensorflow Estimator API)内で入力画像を255で分割しています。次に、モデル内で、バッチ入力を介してその入力を実行しています。まだこれらの正規化の1つだけを行う必要がありますか?github.com/formigone/tf-imagenet/blob/master/models/…を
rodrigo-silveira

私の理解では、255による除算は各画像に対して1回だけ行われ、その理由は、数値の安定性を提供するために、0から1までのすべての値を保持することです。
フアンアントニオゴメスモリアーノ

確かに、私はそれを得る。しかし、範囲[0、1]の値をバッチで正規化することも理にかなっていると思いますか?
ロドリゴシルベイラ

それはわかりませんが、バッチ正規化を使用してからしばらく経ちました:)
Juan Antonio Gomez

3

Neil Slaterが示唆したように、検証精度の学習プロットを分析することをお勧めします。次に、検証の精度が低下してネットワークのサイズを小さくしようとすると(深すぎるように見えます)、CONVレイヤーにドロップアウトを追加し、各レイヤーの後にBatchNormalizationを追加します。オーバーフィットを取り除き、テストの精度を高めるのに役立ちます。


アドバイスをありがとう、試してみてください、しかし、CONVレイヤーはドロップアウトを必要としないという印象を受けました、私が読んだほとんどの論文では、ドロップアウトはコンボリューチンではなく、最後に完全に接続されたレイヤーに常に適用されるようです。
フアンアントニオゴメスモリアーノ

3

問題にはいくつかの解決策があります。

  1. 以前のレイヤー(畳み込みレイヤー)でもドロップアウトを使用します。

  2. あなたのネットワークは、このような「簡単な」タスクにはどういうわけか非常に大きいようです。減らすようにしてください。また、大きなアーキテクチャは、はるかに大きなデータセットでトレーニングされています。

「大きな」アーキテクチャを維持したい場合は、以下を試してください。

  1. トレーニングデータを実質的に増やすための画像増強

  2. 敵の訓練を試してください。時々役立ちます。


「あなたのネットワークは、このような「簡単な」タスクのために、どういうわけか非常に大きいように思われます。それを減らしてみてください。反対です。たたみ込みを追加すると、精度が向上しました(最初はたった2つのたたみ込みで68%を達成していました)。また、私はすでにデータセットを増強しており、50000個の画像を操作しています。
フアンアントニオゴメスモリアーノ

2

まだ言及されておらず、今後検討できることの1つは、完全に接続されたレイヤーでドロップアウトを増やすことができるということです。

90%のドロップアウト率を使用した論文を一度読みました。多くのノード(正確に思い出すと2048)がありましたが、これをノード数の少ないレイヤーで自分で試してみましたが、場合によっては非常に役立ちました。

私はちょうどそれがどの紙だったか調べました。覚えていた論文は思い出せませんが、90%のドロップアウト率で成功した論文も見つかりました。

Karpathy、A.、Toderici、G.、Shetty、S.、Leung、T.、Sukthankar、R.、&Fei-Fei、L.(2014)。畳み込みニューラルネットワークによる大規模なビデオ分類。コンピュータビジョンとパターン認識に関するIEEE会議の議事録(pp。1725-1732)。

Simonyan、K。、およびZisserman、A。(2014)。ビデオのアクション認識用の2ストリーム畳み込みネットワーク。神経情報処理システムの進歩(pp。568-576)。

Varol、G.、Laptev、I.、&Schmid、C.(2017)。アクション認識のための長期の時間的畳み込み。パターン分析およびマシンインテリジェンスに関するIEEEトランザクション。


0

私もこの問題を抱えていました。それを何時間も飲んだ後、偶然データをシャッフルしてからシステムに送り込んで、出来上がりました。シャッフルがトリックを行ったことを理解するのに少し時間がかかりました!これにより、誰かがフラストレーションから救われることを願っています!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.