Overfitting jaringan saraf convolutional. Putus sekolah tidak membantu


16

Saya bermain sedikit dengan convnets. Secara khusus, saya menggunakan dataset kaggle cats-vs-dogs yang terdiri atas 25000 gambar yang dilabeli sebagai kucing atau anjing (masing-masing 1.200).

Saya telah berhasil mencapai akurasi klasifikasi sekitar 85% pada set pengujian saya, namun saya menetapkan tujuan untuk mencapai akurasi 90%.

Masalah utama saya adalah overfitting. Entah bagaimana itu selalu berakhir terjadi (biasanya setelah zaman 8-10). Arsitektur jaringan saya secara longgar terinspirasi oleh VGG-16, lebih khusus gambar saya diubah ukurannya menjadi , dan kemudian saya jalankan: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)

Semua lapisan kecuali yang terakhir memiliki relus sebagai fungsi aktivasi.

Perhatikan bahwa saya telah mencoba berbagai kombinasi konvolusi (saya mulai dengan konvolusi yang lebih sederhana).

Juga, saya telah menambah dataset dengan mirroring gambar, sehingga total saya memiliki 50.000 gambar.

Juga, saya menormalkan gambar menggunakan normalisasi minimum, di mana X adalah gambar

X=X-0/255-0

Kode ditulis dalam tensorflow dan ukuran batch 128.

Mini-batch data pelatihan berakhir dengan overfitting dan memiliki akurasi 100% sementara data validasi tampaknya berhenti belajar di sekitar 84-85%.

Saya juga mencoba meningkatkan / mengurangi angka putus sekolah.

Pengoptimal yang digunakan adalah AdamOptimizer dengan tingkat pembelajaran 0,0001

Saat ini saya telah bermain dengan masalah ini selama 3 minggu terakhir dan 85% tampaknya telah menjadi penghalang di depan saya.

Sebagai catatan, saya tahu saya bisa menggunakan transfer belajar untuk mencapai hasil yang jauh lebih tinggi, tetapi saya tertarik untuk membangun jaringan ini sebagai pengalaman belajar mandiri.

Memperbarui:

Saya menjalankan jaringan SAMA dengan ukuran batch yang berbeda, dalam hal ini saya menggunakan ukuran batch yang jauh lebih kecil (16 bukannya 128) sejauh ini saya mencapai akurasi 87,5% (bukan 85%). Yang mengatakan, jaringan akhirnya tetap overfitting. Masih saya tidak mengerti bagaimana dropout 50% dari unit tidak membantu ... jelas saya melakukan sesuatu yang salah di sini. Ada ide?

Pembaruan 2:

Sepertinya masalah ada hubungannya dengan ukuran bets, karena dengan ukuran yang lebih kecil (16 bukannya 128) sekarang saya mencapai akurasi 92,8% pada set pengujian saya, dengan ukuran bets yang lebih kecil jaringan masih overfits (bets mini berakhir namun dengan akurasi 100%), kerugian (kesalahan) terus menurun dan secara umum lebih stabil. Kontra adalah waktu berjalan yang jauh lebih lambat, tapi itu benar-benar layak untuk ditunggu.


2
Bisakah Anda memberikan rincian lebih lanjut tentang penilaian Anda yang terlalu pas? Misalnya, apakah akurasi validasi turun pada titik mana pun, di samping perbedaan dari hasil pelatihan dan validasi? Bagaimana dengan fungsi kerugiannya?
Neil Slater

Pertanyaan yang bagus, jadi dengan overfitting yang saya maksudkan adalah fakta bahwa mini-batch dalam kereta mencapai akurasi 100% dan kerugian 0,08 sementara validasi tampaknya tidak pernah turun di bawah 0,35 dan akurasinya tetap di 88%. Sesuai validasi tampaknya tidak turun (setidaknya tidak terlalu banyak), tampaknya menjadi datar, namun bagaimana mungkin batch mini mencapai kerugian yang begitu rendah sementara validasi masih jauh dari itu?
Juan Antonio Gomez Moriano

Saya tidak tahu jawaban untuk Anda, namun perilaku ini - perbedaan besar antara kereta dan validasi, tetapi masih validasi OK-ish dataran tinggi - adalah sesuatu yang telah saya lihat sebelumnya beberapa kali. Saya hampir ragu untuk menyebutnya terlalu pas karena terkadang hasil tes dapat diterima.
Neil Slater

"Tetap saya tidak mengerti bagaimana dropout 50% dari unit tidak membantu" Saya telah melihat orang menggunakan nilai dropout yang jauh lebih tinggi dengan kesuksesan.
Ricardo Cruz

Jawaban:


14

Ok, jadi setelah banyak eksperimen saya berhasil mendapatkan beberapa hasil / wawasan.

Di tempat pertama, semuanya sama, batch yang lebih kecil dalam set pelatihan banyak membantu dalam rangka meningkatkan kinerja umum jaringan, sebagai sisi negatif, proses pelatihan muuuuuch lebih lambat.

Poin kedua, data itu penting, tidak ada yang baru di sini, tetapi ketika saya belajar sambil mengatasi masalah ini, lebih banyak data sepertinya sedikit membantu.

Poin ketiga, dropout berguna dalam jaringan besar dengan banyak data dan banyak iterasi, dalam jaringan saya, saya menerapkan dropout hanya pada lapisan yang terhubung sepenuhnya, lapisan konvolusi tidak menerapkan dropout.

Poin keempat (dan ini adalah sesuatu yang saya pelajari berulang-ulang): neword netword membutuhkan BANYAK untuk dilatih, bahkan pada GPU yang baik (saya melatih jaringan ini di floydhub, yang menggunakan kartu NVIDIA yang cukup mahal), jadi PATIENCE adalah kuncinya .

Kesimpulan akhir: Ukuran batch lebih penting dari yang diperkirakan, tampaknya lebih mudah untuk mencapai minimum lokal ketika batch lebih besar.

Kode yang saya tulis tersedia sebagai notebook python, saya pikir itu didokumentasikan dengan baik

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


Terima kasih telah memposting temuan Anda. Pertanyaan singkat: Aku sedang menghadapi masalah yang sama dan saya melihat ini di notebook Anda diposting: NOTE USE EITHER mean centering or min-max, NOT BOTH. Saat ini saya membagi gambar input saya dengan 255 di dalam saya input_fn(Tensorflow Estimator API). Kemudian, di dalam model, saya menjalankan input itu melalui norma batch. Haruskah saya hanya melakukan salah satu dari normalisasi itu? Lihat github.com/formigone/tf-imagenet/blob/master/models/…
rodrigo-silveira

Pemahaman saya adalah bahwa membagi dengan 255 dilakukan hanya sekali untuk setiap gambar, dan alasannya adalah untuk menjaga semua nilai antara 0 dan 1 karena itu akan memberikan stabilitas numerik.
Juan Antonio Gomez Moriano

Tentu, saya mengerti. Tetapi apakah menurut Anda masuk akal juga untuk menormalisasi nilai-nilai itu dalam kisaran [0, 1]?
rodrigo-silveira

Itu, saya tidak tahu, sudah lama saya tidak menggunakan normalisasi batch :)
Juan Antonio Gomez Moriano

3

Saya sarankan Anda menganalisis plot pembelajaran akurasi validasi Anda seperti yang disarankan Neil Slater. Kemudian, jika akurasi validasi turun, coba kurangi ukuran jaringan Anda (tampak terlalu dalam), tambahkan dropout ke layer CONV dan BatchNormalisasi setelah setiap layer. Ini dapat membantu menghilangkan overfitting dan meningkatkan akurasi tes.


Terima kasih atas sarannya, akan mencobanya, namun saya mendapat kesan bahwa lapisan CONV tidak memerlukan dropout, pada sebagian besar makalah yang saya baca, dropout tampaknya selalu diterapkan pada lapisan yang sepenuhnya terhubung, bukan ke konvolutin.
Juan Antonio Gomez Moriano

3

Ada beberapa solusi yang mungkin untuk Masalah Anda.

  1. Gunakan Dropout di lapisan sebelumnya (lapisan convolutional) juga.

  2. Jaringan Anda tampaknya cukup besar untuk tugas yang "mudah"; cobalah untuk menguranginya. Arsitektur besar juga dilatih tentang kumpulan data yang jauh lebih besar.

Jika Anda ingin mempertahankan arsitektur "besar" Anda, cobalah:

  1. Augmentasi gambar untuk meningkatkan data pelatihan Anda secara virtual

  2. Coba pelatihan permusuhan. Terkadang membantu.


"Jaringan Anda sepertinya cukup besar untuk tugas" mudah "seperti itu; cobalah menguranginya. Arsitektur besar juga dilatih dengan kumpulan data yang jauh lebih besar." Saya tidak setuju, karena saya menambahkan lebih banyak belitan, keakuratannya meningkat (awalnya saya mencapai 68% hanya dengan dua belokan). Juga, saya sudah menambah dataset saya, saya beroperasi dengan 50.000 gambar.
Juan Antonio Gomez Moriano

2

Satu hal yang belum disebutkan dan yang dapat Anda pertimbangkan untuk masa depan: Anda masih dapat meningkatkan angka putus sekolah di lapisan yang sepenuhnya terhubung.

Saya pernah membaca makalah yang pernah menggunakan angka putus sekolah 90%. Meskipun memiliki banyak banyak node (2048 jika saya ingat dengan benar), saya telah mencoba ini sendiri pada layer dengan lebih sedikit node dan itu sangat membantu dalam beberapa kasus.

Saya hanya mencari kertas yang mana. Saya tidak dapat mengingat makalah mana yang baru saya ingat tetapi saya menemukan makalah ini yang juga sukses dengan angka putus sekolah 90%.

Karpathy, A., Toderici, G., Shetty, S., Leung, T., Sukthankar, R., & Fei-Fei, L. (2014). Klasifikasi video skala besar dengan jaringan saraf convolutional. Dalam Prosiding konferensi IEEE tentang Computer Vision dan Pattern Recognition (hal. 1725-1732).

Simonyan, K., & Zisserman, A. (2014). Jaringan konvolusional dua aliran untuk pengenalan tindakan dalam video. Dalam Kemajuan dalam sistem pemrosesan informasi saraf (hal. 568-576).

Varol, G., Laptev, I., & Schmid, C. (2017). Konvolusi temporal jangka panjang untuk pengakuan tindakan. Transaksi IEEE pada analisis pola dan kecerdasan mesin.


0

Saya punya masalah ini juga. Setelah menghabiskan waktu berjam-jam, kebetulan saya memutuskan untuk mengacak data sebelum memasukkannya ke dalam sistem dan voila, itu mulai bekerja. Aku butuh sedikit waktu untuk mengetahui bahwa itu adalah pengocokan yang melakukan trik! Semoga ini menyelamatkan seseorang dari frustrasi!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.