Pazar, Temmuz 10, 2016

Caffe ile Finetune - Eğitimin Transferi - Örneği

Caffe malumunuz bir derin öğrenme kütüphanesi. Daha önce bahsettiğimiz için bu yazımızda anlatmayacağız. Önceki yazımız okumamış olanlar
Caffe for Windows 

burdan okuyabilirler. Biz bu yazımızda eğitimin transferinden - finetune - bahsedeceğiz. Derin öğrenme için gerekenlerin başında büyük mikdarda ve çeşitlilikte veri. Ve bu veriyi uygun hızda eğititebilecek işlem gücü. Eldeki -evdeki- imkanlarla bu tür bir uygulamaya girişmek bu yüzden pek mümkün olmuyordu. İşte burda eğitimin transferi imdadımıza yetişiyor.

-Fine Tune- Eğitimin Transferi nedir ?   Eğitim Ağ yapısında giriş den çıkışa en az hata ile ulaştıran ağırlık değerlerinin bulunmasından ibarettir. Adım adım anlatmak gerekirse.
  1. Ağırlık değerleri başlangıçta belli metodlarla yada rastgele belirlenir. 
  2. Giriş verileri, ağırlıklar ile çalıştırılıp çıkış değerleri hesaplanır.
  3. Hesaplanan değerlerle gerçek değerler arasındaki fark hesaplanır.
  4. Eğer bu fark istenen küçüklükte ise eğitim tamamlanır.
  5. Fark istenenden büyük ise Farka  göre ağ boyunca geriye doğru ağırlıklar güncellenir
  6. 2. Adıma dönülür.
Fine Tune terimin tam tercümesi ince ayardır. Başka bir veri seti için uygun şekilde eğitilmiş ağın yapısındaki ağırlık değerlerinin  kısmen alınarak,  yeni  başka bir veri için daha kısa sürede eğitiminde kullanma işlemine eğitimin transeferi diyoruz.

Örnek :  Men vs Women Shoes  

Önce veri hazırlayalım. Amacımız Erkek-Kadın ayakkabısı ayrımını yapabilen bir sistem olsun. Veriler için Ayakkabı satan bir e-ticaret sitesine - shoes.com -  uğradık


http://www.shoes.com/

Kadın ve erkek ayakkabıları için 420 şer tane örnek resim aldık. Bunların %70 ini eğitim %30 unu test için kullanılacak şekilde ayarladık. 'convert_imageset' ile resimler 256x256 ebatına getirilip LMDB formatında veritabanına aktarıldı. 'compute_image_mean' ile eğitim için kullanacağımız veri tabanından ortalama matrisi çıkarıldı.

Bundan sonraki adım için daha önceden eğitilmiş bir model seçmek gerekiyor. Caffe-Model Zoo da pek çok  eğitilmiş hazır model bulmanız mümkün.  Biz GoogLeNet i kullandık.  Caffe ile gelen modellerden biri pek çok  finetune örneğide var.  mesela;

modelin eğitim için kullanılacak prototxt dosyasında  eğitim transferi için yapmamız gereken değişiklikler var.

Öncelikle Loss katmanı - genellikle softmax - öncesi "InnerProduct" katmanının adını değiştirin. Bağlantılı olduğu katmanlardaki  adlarıda unutmayın. Sonra "InnerProduct" katmanının çıkış sayısını  kendi uygulamamıza göre güncelleyin. bizde 2 sınıf olduğunda 2 yapıyoruz.

Sonrasında Güncellediğimiz "InnerProduct" katmanı haricindeki bütün katmanların öğrenme parametrelerini sıfırlıyoruz.  'blobs_lr'  yada  'lr_mult' diye geçen parametreler.  Bu katmanların öğrenme parametrelerini sıfırlayarak eğitim transferi esnasında değişmemesini sağlıyoruz. Çünkü transfer ettiğimiz ağırlıklarda bu katmanlardan geliyor.

Bizim Örneğimizde çıkış sayımız iki olduğundan 'top-5 accuracy'  katmanları yani ilk 5 tahminin doğruluk oranını hesaplayan kısımlarında bir anlamı kalmıyor onlarıda kaldırıyoruz.

Veri giriş dosyalarımızı ve ortalama matris bilgisini data katmanına yazıyoruz. Artık model dosyamız kullanıma hazırdır.

Eğitim için kullanılacak olan solver prototxt dosyasında sadece başlangıç öğrenme hızını normalde olması gereken dendaha düşüğünü seçiyoruz. Eğitimde ilk başta birz daha büyük bir öğrenme hızı ile başlanır. Sonra eğitimde ileri safhalar geçtikçe öğrenme hızı azaltılır. Biz Eğitim transferi yaptığımızdan adını değiştirdiğimiz katman haricinde zaten eğitilmiş bir yapımız vardır. Bu yüzden daha düşük hızla başlıyoruz.

Eğitim transferide bir çeşit eğitimdir. Tıpkı eğitimdeki gibi caffe programını çağırıyoruz.

caffe train -solver solver-fine.prototxt -weights bvlc_googlenet.caffemodel -gpu 0

  Sonuç:

 İmkanımız kısıtlı olduğunda uzun boylu denemler yapamadık.  800 iterasyonla  0.768  başarı oranına - top 1 accuracy - eriştik.


  Modeli kullanıp sonuçları analiz edelim.


Eğitilmiş modeli doğrulamak için yine aynı siteden eğitim için kullanmadığımız resimlerden topladık 112 adetlik bu doğrulama verimizde 55 tane erkek ayakkabısı ve 57 adet kadın ayakkabısı vardı.

Kısa bir python programı yazdık ve doğrulama programı ile çalıştırdık.
 Erkek ayakkabılarından  55 tanesinin 37 tanesi doğru sınıflandırılmış
Kadın ayakkabılarından  57 tanesinin 49 tanesi doğru sınıflandırılmış
Ortalama Tahmin doğruluğu % 76.8

Yanlış sınıflandırlan resimlere bir bakalım.
 Kadın ayakkabısı zannedilen  Erkek ayakkabıları


 Erkek ayakkabısı zannedilen  Kadın ayakkabıları



 Resimlerden görüleceği gibi model haksızda sayılmaz.

Modelimizin doğruluğunu düzeltmek için kullanabileceğimiz bir başka faktörde ihtimal değeri. Model her iki sınıf içinde bir ihtimal değeri veriyor. yüksek olanı tahmin etti diyoruz. Lakin ihtimallerin bir birine yakın olması durumlarıda var
Mesela ;

Bu ayakkabı için Erkek : 0.45  Kadın = 0.55 diye ihtimal verilmiş.  Kadın ayakkabısı diye tahmin edilmiş ama erkek ayakkabısıymış

Bu ayakkabı için Erkek : 0.49  Kadın = 0.51 diye ihtimal verilmiş.  Kadın ayakkabısı diye tahmin edilmiş Kadın ayakkabısıymış ama ihtimali çok yakın. Muhtemelen bu modele çok benzer erkek ayakkabılarıda vardır.


Sonuç olarak; Başarı oranı çok yüksek gibi görünmeye bilir. Ve elbette daha çok veri ve bazı ince ayar ve denemelerle muhakak ki daha iyi sonuçlara ulaşılabilir. Fakat pek ala insan tarafından da karıştırılabilecek kadın ve erkek ayakkabı modelleri var. Normal olarak bizim modelimizde karıştırıyor. 

Hiç yorum yok: