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.
- Ağırlık değerleri başlangıçta belli metodlarla yada rastgele belirlenir.
- Giriş verileri, ağırlıklar ile çalıştırılıp çıkış değerleri hesaplanır.
- Hesaplanan değerlerle gerçek değerler arasındaki fark hesaplanır.
- Eğer bu fark istenen küçüklükte ise eğitim tamamlanır.
- Fark istenenden büyük ise Farka göre ağ boyunca geriye doğru ağırlıklar güncellenir
- 2. Adıma dönülür.
Ö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
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:
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 ?
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
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?
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
Merhaba;
convert_imageset komutunun parametrelerini nasıl verdiniz ben sunumunuzdan hareketle yaptım fakat invalid syntax hatası aldım denemelerimde
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 ?
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
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...
Yorum Gönder