私はconvnetsで少し遊んでいます。具体的には、猫または犬(それぞれ12500)としてラベル付けされた25000個の画像で構成されるkaggle cats-vs-dogsデータセットを使用しています。
テストセットで約85%の分類精度を達成できましたが、90%の精度を達成するという目標を設定しました。
私の主な問題は過剰適合です。どういうわけか、それは常に起こることになります(通常、エポック8-10の後)。私のネットワークのアーキテクチャは、VGG-16に大まかに触発されています。具体的には、画像のサイズをに変更し、次に実行します。
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は画像です
コードはテンソルフローで記述されており、バッチサイズは128です。
トレーニングデータのミニバッチは過剰に適合し、100%の精度になりますが、検証データは約84〜85%で学習を停止するようです。
また、ドロップアウト率を増減しようとしました。
使用されているオプティマイザーは、学習率0.0001のAdamOptimizerです
現時点では、この3週間この問題に取り組んでおり、85%が私の前に障壁を置いているようです。
記録のために、私は転移学習を使用してはるかに高い結果を達成できることを知っていますが、このネットワークを自己学習体験として構築することに興味があります。
更新:
異なるバッチサイズで同じネットワークを実行していますが、この場合ははるかに小さいバッチサイズ(128ではなく16)を使用しており、これまでのところ87.5%の精度(85%ではなく)を達成しています。とは言っても、ネットワークはとにかく過剰に適合します。それでも、ユニットの50%のドロップアウトがどのように役立っていないかはわかりません...明らかに、ここで何か間違ったことをしています。何か案は?
アップデート2:
問題はバッチサイズに関係しているようです、小さいサイズ(128ではなく16)のように、テストセットで92.8%の精度を達成していますが、小さいバッチサイズではネットワークはまだ適合していません(ミニバッチただし、100%の精度で)、損失(エラー)は減少し続け、一般的に安定しています。短所は実行時間が非常に遅くなりますが、待つだけの価値はあります。