Evrişimli sinir ağlarında aşırı uyum. Bırakma yardımcı olmuyor


16

Biraz konnets ile oynuyorum. Özellikle, kedi veya köpek (her biri 12500) olarak etiketlenmiş 25000 görüntüden oluşan kaggle cats---dogs veri kümesini kullanıyorum.

Test setimde yaklaşık% 85 sınıflandırma doğruluğu elde etmeyi başardım, ancak% 90 doğruluk elde etme hedefi belirledim.

Benim asıl sorunum aşırı uymak. Her nasılsa her zaman olur (normalde 8-10 döneminden sonra). Ağımın mimarisi VGG-16'dan gevşek bir şekilde ilham alıyor, daha spesifik olarak görüntülerim 128x128x3 olarak yeniden boyutlandırılıyor ve çalıştırıyorum:

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)

Sonuncusu hariç tüm katmanlar aktivasyon fonksiyonu olarak relus'a sahiptir.

Farklı kıvrım kombinasyonlarını denediğimi unutmayın (daha basit kıvrımlarla başladım).

Ayrıca, görüntüleri yansıtarak veri kümesini artırdım, böylece toplamda 50000 görüntü var.

Ayrıca, min max normalleştirme kullanarak görüntüleri normalleştiriyorum, burada X görüntüdür

X=X-0/255-0

Kod tensorflow ile yazılır ve toplu iş boyutları 128'dir.

Mini eğitim verisi grupları aşırı uyum sağlar ve% 100 doğruluk sağlarken, doğrulama verileri öğrenmeyi% 84-85 civarında durduruyor gibi görünmektedir.

Ayrılma oranını artırmaya / azaltmaya çalıştım.

Kullanılan optimizer 0.0001 öğrenme oranına sahip AdamOptimizer

Şu anda bu sorunla son 3 haftadır oynuyorum ve% 85'i önümde bir engel oluşturmuş gibi görünüyor.

Kayıt için, transfer öğrenimini daha yüksek sonuçlar elde etmek için kullanabileceğimi biliyorum, ancak bu ağı kendi kendine öğrenme deneyimi olarak inşa etmede ilginçim.

Güncelleme:

SAME ağını farklı bir toplu iş boyutuyla çalıştırıyorum, bu durumda çok daha küçük bir toplu iş boyutu kullanıyorum (128 yerine 16) şu ana kadar% 87.5 (% 85 yerine) doğruluk elde ediyorum. Bununla birlikte, ağ yine de aşırı sığdır. Yine de, birimlerin% 50'sinin bırakılmasının nasıl yardımcı olmadığını anlamıyorum ... Açıkçası burada yanlış bir şey yapıyorum. Herhangi bir fikir?

Güncelleme 2:

Sorun, daha küçük bir boyutta olduğu gibi (128 yerine 16) toplu boyutla ilgili olması gerektiği gibi görünüyor. Test setimde şu anda% 92.8 doğruluk elde ediyorum, ağın hala fazla olan daha küçük parti boyutu ile (mini gruplar sona eriyor) ancak% 100 doğrulukla) kayıp (hata) azalmaya devam eder ve genel olarak daha kararlıdır. Eksileri çok daha yavaş çalışma süresi vardır, ama tamamen beklemeye değer.


2
Aşırı uydurma değerlendirmeniz hakkında daha fazla bilgi verebilir misiniz? Örneğin, doğrulama doğruluğu , eğitim ve doğrulama sonuçlarından sapmanın yanı sıra herhangi bir noktada düşüyor mu? Kayıp fonksiyonu nasıl olur?
Neil Slater

İyi soru, bu yüzden aşırı takma ile, trendeki mini partilerin% 100 doğruluk ve 0.08 kayıp elde etmesini kastediyorum, validasyon hiç 0.35'in altına düşmüyor ve doğruluğu şu anda% 88'de kalıyor. Validasyona göre düşüyor gibi görünmüyor (en azından çok fazla değil), düz görünüyor, ancak doğrulama hala ondan uzakken mini parti nasıl bu kadar düşük bir kayıp elde ediyor?
Juan Antonio Gomez Moriano

Sizin için bir cevap bilmiyorum, ancak bu davranış - tren ve validasyon arasındaki büyük farklılık, ama yine de OK-ish platolu validasyon - daha önce birkaç kez gördüğüm bir şey. Neredeyse uydurma diye tereddüt ediyorum çünkü bazen test sonuçları kabul edilebilir.
Neil Slater

"Yine de ünitelerin% 50'sinin ayrılmasının nasıl yardımcı olmadığını anlamıyorum." İnsanları çok daha yüksek seviyede bırakma değerlerini başarıyla kullanarak gördüm.
Ricardo Cruz

Yanıtlar:


14

Pekala, bir çok denemeden sonra bazı sonuçlar / öngörüler elde etmeyi başardım.

Her şeyden önce, her şey eşit, eğitim setindeki daha küçük gruplar genel performansı arttırmak için çok yardımcı oluyor , ağın , olumsuz bir taraf olarak, eğitim süreci çok daha yavaştır.

İkinci nokta, veriler önemlidir, burada yeni bir şey yoktur, ancak bu sorunla savaşırken öğrendiğim gibi, daha fazla veri her zaman biraz yardımcı görünüyor.

Üçüncü nokta, bırakma, çok fazla veri ve çok sayıda yinelemeye sahip büyük ağlarda kullanışlıdır, ağımda yalnızca son tamamen bağlı katmanlara bırakma uyguladım, kıvrım katmanları bırakma uygulanmadı.

Dördüncü nokta (ve bu tekrar tekrar öğrendiğim bir şey): sinirsel ağlar iyi GPU'larda bile eğitmek için çok şey alıyor (bu ağı oldukça pahalı NVIDIA kartları kullanan floydhub'da eğittim), bu yüzden PATIENCE anahtardır .

Son sonuç: Parti büyüklükleri birinin düşünebileceğinden daha önemlidir, görünüşe göre partiler daha büyük olduğunda yerel bir minimuma ulaşmak daha kolaydır.

Yazdığım kod python defter olarak mevcut, bence iyi belgelenmiş

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


Bulgularınızı gönderdiğiniz için teşekkür ederiz. Hızlı soru: Ben de benzer bir sorunla karşı karşıya ediyorum ve size yayınlanmıştır defterine şu gördük: NOTE USE EITHER mean centering or min-max, NOT BOTH. Şu anda girdi görüntülerimi 255 input_fn(Tensorflow Tahmincisi API) içinde bölüyorum. Sonra, modelin içinde, bu girdiyi toplu norm üzerinden çalıştırıyorum. Hala bu normalleştirmelerden birini yapmalı mıyım? Bkz. Github.com/formigone/tf-imagenet/blob/master/models/…
rodrigo-silveira

255'e bölmenin her görüntüye yalnızca bir kez yapıldığını anlıyorum ve bunun nedeni, sayısal kararlılık sağlayacak tüm değerleri 0 ile 1 arasında tutmaktır.
Juan Antonio Gomez Moriano

Tabii, anladım. Fakat bu değerleri [0, 1] aralığında da normalleştirmek için mantıklı olduğunu düşünüyor musunuz?
rodrigo-silveira

Bu, bilmiyorum, toplu normalizasyon kullandığımdan beri bir süredir :)
Juan Antonio Gomez Moriano

3

Neil Slater'in önerdiği gibi, doğrulama doğruluğunuzun öğrenme grafiklerini analiz etmenizi öneririm. Daha sonra, doğrulama doğruluğu düştüğünde ağınızın boyutunu azaltmaya çalışıyorsanız (çok derin görünüyor), her katmandan sonra CONV katmanlarına bırakma ve BatchNormalization ekleyin. Aşırı takmadan kurtulmaya ve test doğruluğunu artırmaya yardımcı olabilir.


Tavsiye için teşekkürler, deneyeceğim, ancak CONV katmanlarının bırakma gerektirmediği izlenimi altındaydım, okuduğum makalelerin çoğunda, bırakma her zaman bitişik katmanlara değil, kıvrıklara uygulanıyor gibi görünüyor.
Juan Antonio Gomez Moriano

3

Sorununuz için birkaç olası çözüm vardır.

  1. Daha önceki katmanlarda (evrişimli katmanlar) Bırakmayı kullanın.

  2. Ağınız böyle "kolay" bir görev için bir şekilde oldukça büyük görünüyor; azaltmaya çalışın. Büyük mimariler de çok daha büyük veri kümeleri üzerinde eğitilir.

"Büyük" mimarinizi korumak istiyorsanız şunu deneyin:

  1. Egzersiz verilerinizi sanal olarak artırmak için görüntü büyütme

  2. Düşmanlık eğitimini deneyin. Bazen yardımcı olur.


"Ağınız böylesine" kolay "bir görev için bir şekilde oldukça büyük gözüküyor; azaltmaya çalışın. Büyük mimariler de çok daha büyük veri kümelerinde eğitiliyor. Katılıyorum, daha fazla kıvrım ekledikçe, doğruluk arttı (başlangıçta sadece iki kıvrımla% 68'e ulaşıyordum). Ayrıca, veri setimi zaten büyütüyorum, 50000 görüntü ile çalışıyorum.
Juan Antonio Gomez Moriano

2

Henüz bahsedilmeyen ve gelecek için düşünebileceğiniz bir şey: Tamamen bağlı katmanlardaki bırakma oranınızı hala artırabilirsiniz.

Bir keresinde bir makaleyi okudum. Çok sayıda düğüm olmasına rağmen (doğru hatırlıyorsam 2048), kendimi daha az düğümlü katmanlarda denedim ve bazı durumlarda çok yardımcı oldu.

Sadece hangi kağıda baktım. Hangi kağıdı hatırladığımı hatırlayamıyorum, ancak% 90 bırakma oranlarıyla da başarılı olan bunları buldum.

Karpathy, A., Toderici, G., Shetty, S., Leung, T., Sukthankar, R. ve Fei-Fei, L. (2014). Evrişimli sinir ağları ile büyük ölçekli video sınıflandırması. Bilgisayar Vizyonu ve Örüntü Tanıma konulu IEEE konferansının bildiri kitabında (s. 1725-1732).

Simonyan, K. ve Zisserman, A. (2014). Videolarda eylem tanıma için iki akışlı evrişimli ağlar. Sinirsel bilgi işleme sistemlerindeki ilerlemeler (s. 568-576).

Varol, G., Laptev, I. ve Schmid, C. (2017). Eylem tanıma için uzun süreli geçici kıvrımlar. Kalıp analizi ve makine istihbaratı üzerine IEEE işlemleri.


0

Ben de bu problemi yaşadım. Saatlerce onunla dinkledikten sonra, şans eseri verileri sisteme ve voila'ya beslemeden önce karıştırmaya karar verdim, çalışmaya başladı. Hile yapan karışıklık olduğunu anlamak biraz zaman aldı! Umarım bu birini hayal kırıklığına uğratmaz!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.