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:
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
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.
sumber
Jawaban:
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
sumber
NOTE USE EITHER mean centering or min-max, NOT BOTH
. Saat ini saya membagi gambar input saya dengan 255 di dalam sayainput_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/…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.
sumber
Ada beberapa solusi yang mungkin untuk Masalah Anda.
Gunakan Dropout di lapisan sebelumnya (lapisan convolutional) juga.
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:
Augmentasi gambar untuk meningkatkan data pelatihan Anda secara virtual
Coba pelatihan permusuhan. Terkadang membantu.
sumber
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%.
sumber
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!
sumber