Problem, ağın sadece yapısında değil. Standart bir ağ yapısıda kullansanız ;
- bazı katmanların varlığı yada yokluğu, ( batchnormalization, dropout, pooling,...)
- bazı katmanların çeşitleri ( relu , elu,.... )
- hiper parmetrelerin değerleri. ( filtre büyüklükleri, sayıları , ... )
- Ağ parameterelerinin başlangıç değer atama metodları ( gaussian , xaiver,... )
- vs ..
Lafı çok dolandırmadan devam edelim. Geçen hafta sonu bizde gpu nun boşkalmasından istifade bir deney yapalım istedik.
Deneyimizin konusu Droput ve BatchNormalization denen katmanlar hakkında.
Kısaca bahsedelim;
Dropout Katmanı ; Ağ içindeki bazı bağlantıların kaldırılmasıyla eğitim performansı artacağı varsayılıyor. Dropout katmanına 0 dan büyük 1 den küçük bir oran veriyorsunuz. Eğitim esnasında bu oran miktarındaki bağlantıyı rastgele kapatıyor.Deneyimiz için cifar 100 veri setini seçiyoruz.
Batch Normalization ; Ara Normalizasyon diyeceğiz. Normalde ağın girişini ve çıkışını başlangıçda normalizasyon işlemine sokmanız zaten gerekiyor. Ama ağın içinde işlemler sonucunda da veri dağılımı değişebiliyor. Bu katmanda ağın katmanları arasındaki geçişde verileri normalize ediyor. Olumlu etkilediği söyleniyor.
bakınız
www.cs.toronto.edu/~kriz/cifar.html
32x32 lik renkli görüntülarin 100 sınıf için sınıflandırılmasını gerektiren bir veri seti.
Ağ yapısı olarakda VGG benzeri bir ağ yapısı kullanacağız. Şöyle;
Deneyimiz de bu ağ yapısında dropout katmanına sırasıyla [0.1,0.2,0.3,0.4,0.5] değerlerini vereceğiz ve Bunu hem ara normalizasyon - Batch Normalization - katmanı varken hemde yokken deyeceğiz. Sonuçlara bakacağız. Yani Toplamda 5x2 = 10 defa cifar 100 verisi için ağı eğiteceğiz.
- Ağı eğitmek için maksimum epoch değeri olarak 250 yi seçdik.
- Erken durma - Early Stopping - işleminide koyduk. 13 kez Test başarımında - validation acccuracy - bir iyileşme olmuyorsa eğitim sonlandırılıyor.
- Öğrenme hızınıda Test Başarımına bağladık. 3 epoch boyunca Test başarımında bir düşme olmuyorsa öğrenme hızımızı yarıya düşürüyoruz.
- optimzasyon algoritması için "adam" kullandık
- batch size : 128
- loss='categorical_crossentropy'
- metrics=["accuracy"]
Ara Normalizasyonlu sonuçlar
- 'Dropout' ; dropout oranı
- 'MaxAccuracy' ; Eğitim esnasında ulaşılan maksimum Başarı değeri
- 'MaxValAccuracy' ; Test verisiyle ulaşılan maksimum Başarı değeri
- 'MinLoss' ; Eğitim esnasında ulaşılan minimum Hata değeri
- 'MinValLoss' ; Test verisiyle ulaşılan minimum Hata değeri
İlk tabloda gördüğümüz gibi dropout oranı arttıkça Eğitim başarısı düşüyor. Fakat 0.2 ye kadar Test verisi başarısını artırıyor.
İki tabloyu karşılaştırdığımızda bariz bir şekilde görüyoruz ki ara normalizasyon eğitimimizi olumlu etkilemiş
Ara normalizasyonlu tabloda dropout oranı arttıkça Eğitim başarısı düşüyor. Fakat 0.4'e kadar Test verisi başarısını artırıyor.
Ezberleyince eğitim grafiğimiz nasıl oluyor bakalım
Başarı grafiği
Hata değeri grafiği
Eğitim başarı değerimiz 0.99 sevyesine çıkmasına rağmen test başarı değerimiz 0.45 civarında kalıyor.
deneyimizdeki en başarılı test değerine 0.4 dropout ile ulaşılmış 0.589 Ama 0.3 de ona çok yakın bir değer vermiş 0.585 aslında ralarındak fark çokda büyük değil. Eğitim başarısına bakarsak.
0.3 için 0.962
0.4 için 0.911
Bence 0.35 dropout değeri ile yeniden bir eğitim yapmak lazım. İlla birini seçeceksen 0.3 dropout değerini seçeriz. En başarılı sonucumuzun grafiklerinede bakalım
Başarı Grafiği
Özetlersek ;
- Ara Normalizasyon iyi etkiliyor
- Dropout u kullanmak lazım ama fazlası zarar
- En başarılı modelimiz bile 0.60 başarı sevyesine ancak geliyor başka bir ağ yapısını denemek lazım