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. 

8 yorum:

Gözde dedi ki...

Merhaba;
Siz çok güzel anlatmışsınız teşekkür ederim ama kafamı karıştıran bazı yerler var
Ben bebek bulmak istiyorum Çok sayıda(15000 küsür ) pozitif ve negatif resimlerim var ve bebek olanları 1 olmayanları 0 olarak işaretledim Resmin adresini yolunu vererek train txt dosyası olarak kaydettim Bundan sonraki aşamam sanırım model prototxt ve solver dosyası oluşturmam
1)bunun için uygun googlenet in deploy prototxt ve solver prototxt dosyasını kullanmam uygun olur mu? (ilk caffe for windows yazınızda alpha_train_text adında bir prototxt dosyası gördüm hangisi daha uygun olur?)
3)Compute image mean yaptıktan sonra model ve solver prototxt dosyalarında source kısmına compute image mean ile elde ettiğimiz veriyi mi yazıyoruz? Yazmıyorsak bu kısımda elde edilen veriyi tam olarak nerde kullanıyoruz?
4))Opencv de bunun için haarcascade yapısı var Bebek bulmak için bu yöntemi mi tercih etmeliyim ?

bluekid dedi ki...

1) her ağın kendine göre prototxt dosyası vardır hatta train ve deploy için de farklıdır
3) Evet
4) Haarcascade konum belirlemek için yukarda bahsettiğiniz modeller sınıflandırma için kullanıyor

Gözde dedi ki...

Merhaba;
Cevaplarınız için teşekkür ediyorum
Benim yapmak istediğim şey için (bebek bulma) hangi ağ yapısı uygun olur?
Bir de caffe for windows yazınınzda model prototxt ve solver prototxt den bahsetmiştiniz Peki deploy prototxt ne işe yarıyor?

bluekid dedi ki...

adı üzerinde kullanmak için
eğitim için olanda eğitim esanasında kullanacağı verileri çekeceği yerleri gösteren kısımlar olur vs...

her ikisinide açıp incelerseniz farkalrını görebilirsiniz

Adsız dedi ki...

Merhaba;
convert_imageset komutunun parametrelerini nasıl verdiniz ben sunumunuzdan hareketle yaptım fakat invalid syntax hatası aldım denemelerimde

Adsız dedi ki...

Hocam merhaba;
Ben şöyle bir hata aldım
Check failed: error == cudaSuccess (35 vs. 0) CUDA driver version is insufficient for CUDA runtime version
Github da söylenilen bir iki yol denedim ama hala olmuyor Ne yapabilirim ?

Adsız dedi ki...

Merhaba;
kendi resimlerimden bir dataset oluşturmak istiyorum resimleri adresi ile birlikte txt dosyası ile kaydettim convert_imageset i şu şekilde çağırdım :
convert_imageset C:\frame\caffe:_train.txt LMDB fakat no module matched diyor ve hiçbir şekilde sonuç alamıyorum Ne yapbilirim

bluekid dedi ki...

1) Yorumlarınızı Adsız olarak yazmayın
2) detaylı sorularınız için e-posta atın
3) e-postanızda;
ben ... şu konuda açlışma yapıyordum
sizin şu ... çalışmanızdan faydalanmak istedim.
Fakat ... işlemini yaparken ... konusunda hata alıyorum

formatında bir e-posta atınki cevlandırabileyim...