Pamuk ipliğinden biraz daha sağlam tek bağ: düşünce birliği. O da rüzgarın her an tehdit ettiği bir kandil. Düşünce birliği, düşünen insanlar arasında olur. İnsanların kaçta kaçı düşünür? Düşünenlerin kaçta kaçı karşılaşır ve açılır birbirine. -- Cemil Meriç
Cuma, Haziran 30, 2017
Python ile OpenCv
Malumunuz "OpenCv Görüntü İşleme ve Yapay Öğrenme" adlı bir kitabımız var. Hali hazırda 2. baskısı piyasada. Bidiğiniz gibi kitabımızda konuları C++ bazlı anlattık. Derin öğrenme konuları yüzünden Python diline geçdik. OpenCv de lazım oluyor elbette.
OpenCv yi python ile kullanmak zor değil. Zaten python dili resmi olarak destekleniyor. OpenCv kurulumunda seçenek olarak python eklentisi bulunuyor.
Kitap içindeki örnekleri python ile tekrar yazmaya giriştim. Yeni baskısı olsunda python kısımı eklerim gibi bir durum ufukta görünmüyor malesef. Hali hazırda bir sene önce basılan kitaplardan epey var hala.
Bu durumda ; kitaptaki örnek derslerin python halini github'a attım. Çok karmaşık örnekler değil ama illa açıklama siterseniz kitaba bakmanız gerekebilir. Hali hazırda ilk 6 ders var.
github.com/birolkuyumcu/opencvbook_python
Fırsat buldukça tamamlamaya çalışacağız bakalım kısmet...
Pazar, Haziran 18, 2017
Baki kalan bu kubbede bir hoş seda imiş
Saff Suresi
8. Onlar ağızlarıyla Allah'ın nûrunu söndürmek istiyorlar. Halbuki kâfirler istemeseler de Allah nûrunu tamamlayacaktır.
9. Müşrikler istemeseler de dinini bütün dinlere üstün kılmak için Peygamberini hidayet ve hak ile gönderen O'dur.
10. Ey iman edenler! Sizi acı bir azaptan kurtaracak ticareti size göstereyim mi?
11. Allah'a ve Resûlüne inanır, mallarınızla ve canlarınızla Allah yolunda cihad edersiniz. Eğer bilirseniz, bu sizin için daha hayırlıdır.
12. İşte bu takdirde O, sizin günahlarınızı bağışlar, sizi zemininden ırmaklar akan cennetlere, Adn cennetlerindeki güzel meskenlere koyar. İşte en büyük kurtuluş budur.
13. Seveceğiniz başka bir şey daha var: Allah'tan yardım ve yakın bir fetih. Müminleri (bunlarla) müjdele.
14. Ey iman edenler! Allah'ın yardımcıları olun. Nitekim Meryem oğlu İsa havârîlere: Allah'a (giden yolda) benim yardımcılarım kimdir? demişti. Havârîler de: Allah (yolunun) yardımcıları biziz, demişlerdi. İsrailoğullarından bir zümre inanmış, bir zümre de inkâr etmişti. Nihayet biz inananları, düşmanlarına karşı destekledik. Böylece üstün geldiler.
İnna Lillahi ve İnna İleyhi Raci’un
Perşembe, Mayıs 11, 2017
CaffeNetViewer Caffe için görselleştirme uygulaması
Derin öğrenme ile ilgili kütüphaneler için yazılmış işimizi kolaylaştıran pek bir gui yoktur. Mesela Cafffe için NVDIA nın Digits ürünü dışında herhangi bir uygulamayla karşılaşmadım. Digits ürünüde eğitim için yazılmış bir uygulama ve arka planda caffenin kendilerine has bir versiyonu üzerinde çalışıyor. Kullanıcının işlerinin kolaylaştırılmamasının sebebi ne derseniz. Halen aktif geliştirme aşamasında olan sistemler. Geliştiriciler yeni özellikler, optimizasyonlar vs konularda oldukça meşguller. Kullanıcılar mecburen kendi başlarının çaresine bakmak zorunda kalıyorlar. Kendileri için bir şeyler geliştirenler olsada pek dışarıya açılmıyor.
Caffe ile olan çalışmalarda bizde mecburen kendi işlerimizi kolaylaştıran pek çok kodlar yazdık. Bu yazımızda benzeri ihtiyaçlar için yazdığımız bir uygulamanın sağını solunu düzeltip yayınlamak istiyoruz.
Uygulamamızın adı CaffeNetViewer. Caffe Ağ yapısı ve ağın içinde verinin ne şekilde değişimlere uğradığını görebileceğimiz bir uygulama. Kullanımından bahsedelim.
- Model dosyası (*.prototxt)
- Ağırlık dosyası (*.caffemodel)
- Ağı çalıştırmak için kullanacağımız Görüntü dosyası
Bundan sonra katmanlar arasında gezinti yapıp katman çıkış değerlerini görebilirsiniz
Katmanların çıkışlarını toplu olarak görebileceğiniz gibi katman katmanda görebiliyorsunuz.
Eksik olan kısımlar var. Fırsat bulursak tamamlamaya çalışacağız.
Kullanabilmeniz için yüklemeniz gereken paketler
- Caffe ve pyCaffe
- OpenCv
- pySide
github.com/birolkuyumcu/caffeNetViewer
Görüş ve önerilerinizi bekleriz
Etiketler:
caffe,
derin öğrenme,
OpenCv,
PySide,
python
Salı, Nisan 25, 2017
Semantik Bölütleme ve Autoencoder
Başlıktanda anlaşılacağı üzre semantik bölütlemeye devam edeceğiz.
Building_Segmentation from bluekid on Vimeo.
Bölütleme pekçok görsel çözümün temelinde bulunması gereken bir aşama. İnsanoğlunun görmesinin de önemli bir parçası. Görme alanımızın tamamına sürekli dikkat etmeyiz. sadece yaptığımız iş için gerekli olan kısımı takip ederiz. İnsanoğlu hem konumlandırır hemde tanır. Semantik bölütleme makinaları bir aşama daha insan algısına yaklaştıırır.
Uygulama alanı çok geniştir. Medikal görüntü işlemeden, otonom araca, sanayide kalite kontrolden, e-ticare, uzaktan algılamaya kadar pek çok alanda kullanılabilir.
Konuyla ilgili çalışmaların linklerini bu adresde listlemişler
Bizde bir çalışma yapalım istedik ve uygun bir veri seti aradık. Sonunda uydu görüntülerinden bina bölütleme için hazırlanmış şu küçük veri setine ulaştık
Veriler IKONOS ve QuickBird uydularından çekilmiş 14 resim ve o resmilerdeki binalar için bölütlemeyi gösteren çıkış resimlerinden oluşuyor.
Veriler hakkında ki detaylı bilgileri şurdan alabilirsiniz
Resimler tiff formatında fakat uydunun çektiği görüntü multi-spektral olduğundan (B, G, R, and NIR) ilave katmanı var. Biz bu çalışmamızda normal görünür katmanları kullanacağız. Bu özel tiff formatını okuyabilmeniz için şu yazıdan faydalana bilirsiniz.
Öncelikle Uydu fotoğraflarını sadce RGB kanalları ile kaydediyoruz.
Fotoğrafların ebatlarındaki değişiklik ve büyük olmaları Eğiteceğimiz ağa doğrudan vermemizi zorlaştırıyor. Keza 14 resimde veri sayısı olara az. Çözüm olarak her resimden rastgele 256x256 ebatında 100 er örnek alıyoruz. Aslında doğrusu verileri çoğaltamak olmadı en azından ilaveten resimlere gürültü ekleme döndürme işlemleride uygulamakdi. Biz bu kadarla iktifa ettik
Verilerimizi hazırladığımıza göre ağımıza geçebiliriz. Biz kerası kullandık bu problem için.
Bahsettiğimiz yazının "Convolutional autoencoder" kısmında ilginç bir problem çözülüyor.
Gürültü eklenmiş görüntüler
temizleniyor. Giriş olarak üsttteki resimler veriliyor. İstenen çıkış olarak alttaki resimleri veriyorlar. Ağı gürültülü resimden temizlenmiş resme ulaşacak şekilde eğitiliyor. Ağ yapısıda oldukça basit
Encoder ; Giriş resmini alıp Conv2D ve MaxPooling2D katmanları ile ebatça küçültülüyor.
Decoder ; Encoderdan gelen veriyi Conv2D ve UpSampling2D katmanları ile ebatça büyütülüyor ve nihayetinde çıkış verisine eşleniyor.
Katman dedik ama yazılışı tuhafınıza gitmiş olabilir aslında Kerasın iki ana şekilde kodlama imkanı var biri daha önceki bahsettiğimiz kamanlar halindeki diğeride burda görmekte olduğunuz katmanların fonksiyonlar olarak tanımlandığı tarz detaylar için bakınız
elbette filtre sayılarınıda artırdık. Problemin zorluğuna göre ağın katman sayısını ve topolojisini değeiştirmek gerekiyor. Mesela Medikal görüntüler üzerinde çalışan u-net diye adlandırılımış şöyle bir yapı var
bu karmaşık ağ yapısı ve kullanımı için Kaggle 'ın "Ultrasound Nerve Segmentation" yarışması için hazırlanmış çalışmaya
Unutmadan Dice ölçütünden de bahsedelim;
wikipedia da Sørensen–Dice coefficient diye geçiyor teferruatını merak edenler oraya bakabilir.
Biz burda olabildiğince sade anlatmaya çalışacağız.
Ağın eğitimi dediğimiz şey hatasını görmesiyle ! mümkün. Ağın hesapladığı çıktı ile gerçekte olması gereken çıktı rasındaki fark bize hatayı veriyor ve hata değerimize göre ağın içindeki parametreler düzeltilerek,k hatayı minimize etmeye çalışıyoruz. Eğitim dediğimiz bu.
Bizim problemimizde aslında nokta bazında bir sınıflandırma yapılıyor. Bir noktanın iki ihtimali var. Ya Bir binaya ait yada değil. Ama şöyle bir problem varki elimizdeki verilirin çoğunda noktalar bir binaya ait değil. Bu yüzden klasik bir hata hesabıyla elde edeceğimiz sonuç bize doğru bir hata değeri vermiyor. Örneklendirelim
Resimlerde Bina olan kısımlar beyaz diğer kısımlar arka plan siyah gösteriliyor.
Ağımız şöyle bir çıktı hesaplamış olsun
Gerçekte olması gerekense şu olsun
klasik bir fark ile hesaplarsa bu iki resim arasındaki tutmayan kısımlar, yani bina yı arka plan yada arka planı bina diye tahmin ettiğimiz yerler
Koca resmin çok az bir kısmı tutmamış :) . Bu şekilde hesaplanan hata değeri oldukça küçük çıkacaktır. Küçük hata değeride eğitimin yetersiz olmasına sebep olur.
Oysa gerçekte sadece binaya bina dediğimiz şekilde bakarsak
gördüğünüz gibi Binanın olduğu yeri tahmin olarak çok küçük bir kısmı doğru tahmin etmiş ağ.
Bu problemin çözümü için şöyle bir hesaplama yapılıyor. Bina için Doğru hesaplanan noktaların sayısının iki katı alınıyor ve bu sayı hesaplanan ve gerçek çıktı resimlerindeki noktaların toplamına bölünüyor. Hiç tutmadığında 0 . ve tamamen çakıştığında 1 çıktısı veren bir ölçüte sahip olmuş oluyoruz.
Ölçüt tek başına bir işe yaramıyor bu ölçütten bir hata değeri hesaplayan bir özel bir loss fonkisyonu yazmamız lazım ki Eğitime bir faydası dokunsun.
Nasıl kodlandığını görmek isterseniz
Sonuçda bir kaç günü aşkın eğitim ve ağ düzenleme faaliyetleri sonunda Yukarda videoda gördüğünüz sonuçlara ulaştık.
Dice ölçütü
Her türlü görüş, düzeltme , soru ve önerilerinizi bekleriz.
Building_Segmentation from bluekid on Vimeo.
Bölütleme pekçok görsel çözümün temelinde bulunması gereken bir aşama. İnsanoğlunun görmesinin de önemli bir parçası. Görme alanımızın tamamına sürekli dikkat etmeyiz. sadece yaptığımız iş için gerekli olan kısımı takip ederiz. İnsanoğlu hem konumlandırır hemde tanır. Semantik bölütleme makinaları bir aşama daha insan algısına yaklaştıırır.
Uygulama alanı çok geniştir. Medikal görüntü işlemeden, otonom araca, sanayide kalite kontrolden, e-ticare, uzaktan algılamaya kadar pek çok alanda kullanılabilir.
Konuyla ilgili çalışmaların linklerini bu adresde listlemişler
handong1587.github.io/deep_learning/2015/10/09/segmentation.htmlbir inceleyin uzun web aramalarından sizi kurtaracaktır.
Bizde bir çalışma yapalım istedik ve uygun bir veri seti aradık. Sonunda uydu görüntülerinden bina bölütleme için hazırlanmış şu küçük veri setine ulaştık
Building Detection Dataset ( web, data , ground truth )
Veriler IKONOS ve QuickBird uydularından çekilmiş 14 resim ve o resmilerdeki binalar için bölütlemeyi gösteren çıkış resimlerinden oluşuyor.
Veriler hakkında ki detaylı bilgileri şurdan alabilirsiniz
Resimler tiff formatında fakat uydunun çektiği görüntü multi-spektral olduğundan (B, G, R, and NIR) ilave katmanı var. Biz bu çalışmamızda normal görünür katmanları kullanacağız. Bu özel tiff formatını okuyabilmeniz için şu yazıdan faydalana bilirsiniz.
Öncelikle Uydu fotoğraflarını sadce RGB kanalları ile kaydediyoruz.
Fotoğrafların ebatlarındaki değişiklik ve büyük olmaları Eğiteceğimiz ağa doğrudan vermemizi zorlaştırıyor. Keza 14 resimde veri sayısı olara az. Çözüm olarak her resimden rastgele 256x256 ebatında 100 er örnek alıyoruz. Aslında doğrusu verileri çoğaltamak olmadı en azından ilaveten resimlere gürültü ekleme döndürme işlemleride uygulamakdi. Biz bu kadarla iktifa ettik
Verilerimizi hazırladığımıza göre ağımıza geçebiliriz. Biz kerası kullandık bu problem için.
Building Autoencoders in Kerasyazısındaki kodlardan faydalandık.
Bahsettiğimiz yazının "Convolutional autoencoder" kısmında ilginç bir problem çözülüyor.
Gürültü eklenmiş görüntüler
temizleniyor. Giriş olarak üsttteki resimler veriliyor. İstenen çıkış olarak alttaki resimleri veriyorlar. Ağı gürültülü resimden temizlenmiş resme ulaşacak şekilde eğitiliyor. Ağ yapısıda oldukça basit
Encoder ; Giriş resmini alıp Conv2D ve MaxPooling2D katmanları ile ebatça küçültülüyor.
Decoder ; Encoderdan gelen veriyi Conv2D ve UpSampling2D katmanları ile ebatça büyütülüyor ve nihayetinde çıkış verisine eşleniyor.
Katman dedik ama yazılışı tuhafınıza gitmiş olabilir aslında Kerasın iki ana şekilde kodlama imkanı var biri daha önceki bahsettiğimiz kamanlar halindeki diğeride burda görmekte olduğunuz katmanların fonksiyonlar olarak tanımlandığı tarz detaylar için bakınız
Keras functional APIYazıdaki problemde giriş ebatı ufak ve nispeten daha kolay bir problem biz bu yüzden kendi çalışmamızda ilave katmanlar ekledik
Encoder için ; Conv2D ve MaxPooling2D
Decoder için ; Conv2D ve UpSampling2D
elbette filtre sayılarınıda artırdık. Problemin zorluğuna göre ağın katman sayısını ve topolojisini değeiştirmek gerekiyor. Mesela Medikal görüntüler üzerinde çalışan u-net diye adlandırılımış şöyle bir yapı var
bu karmaşık ağ yapısı ve kullanımı için Kaggle 'ın "Ultrasound Nerve Segmentation" yarışması için hazırlanmış çalışmaya
ultrasound-nerve-segmentationbakabilirsiniz.
Unutmadan Dice ölçütünden de bahsedelim;
wikipedia da Sørensen–Dice coefficient diye geçiyor teferruatını merak edenler oraya bakabilir.
Biz burda olabildiğince sade anlatmaya çalışacağız.
Ağın eğitimi dediğimiz şey hatasını görmesiyle ! mümkün. Ağın hesapladığı çıktı ile gerçekte olması gereken çıktı rasındaki fark bize hatayı veriyor ve hata değerimize göre ağın içindeki parametreler düzeltilerek,k hatayı minimize etmeye çalışıyoruz. Eğitim dediğimiz bu.
Bizim problemimizde aslında nokta bazında bir sınıflandırma yapılıyor. Bir noktanın iki ihtimali var. Ya Bir binaya ait yada değil. Ama şöyle bir problem varki elimizdeki verilirin çoğunda noktalar bir binaya ait değil. Bu yüzden klasik bir hata hesabıyla elde edeceğimiz sonuç bize doğru bir hata değeri vermiyor. Örneklendirelim
Resimlerde Bina olan kısımlar beyaz diğer kısımlar arka plan siyah gösteriliyor.
Ağımız şöyle bir çıktı hesaplamış olsun
Gerçekte olması gerekense şu olsun
klasik bir fark ile hesaplarsa bu iki resim arasındaki tutmayan kısımlar, yani bina yı arka plan yada arka planı bina diye tahmin ettiğimiz yerler
Koca resmin çok az bir kısmı tutmamış :) . Bu şekilde hesaplanan hata değeri oldukça küçük çıkacaktır. Küçük hata değeride eğitimin yetersiz olmasına sebep olur.
Oysa gerçekte sadece binaya bina dediğimiz şekilde bakarsak
gördüğünüz gibi Binanın olduğu yeri tahmin olarak çok küçük bir kısmı doğru tahmin etmiş ağ.
Bu problemin çözümü için şöyle bir hesaplama yapılıyor. Bina için Doğru hesaplanan noktaların sayısının iki katı alınıyor ve bu sayı hesaplanan ve gerçek çıktı resimlerindeki noktaların toplamına bölünüyor. Hiç tutmadığında 0 . ve tamamen çakıştığında 1 çıktısı veren bir ölçüte sahip olmuş oluyoruz.
Ölçüt tek başına bir işe yaramıyor bu ölçütten bir hata değeri hesaplayan bir özel bir loss fonkisyonu yazmamız lazım ki Eğitime bir faydası dokunsun.
Nasıl kodlandığını görmek isterseniz
github.com/jocicmarko/ultrasound-nerve-segmentation/blob/master/train.pybu dosyadan dice_coef ve dice_coef_loss fonksiyonlarını inceleyebilirsiniz. Bizde eğitimizde bu metriği ve loss fonkisyonunu kullandık.
Sonuçda bir kaç günü aşkın eğitim ve ağ düzenleme faaliyetleri sonunda Yukarda videoda gördüğünüz sonuçlara ulaştık.
Dice ölçütü
Eğitim verisi için 0.9148'e kadar yükseldi.
Test verisi için 0.7530
Her türlü görüş, düzeltme , soru ve önerilerinizi bekleriz.
Pazartesi, Mart 13, 2017
Semantik Bölütleme ve FCN
Resimde nelerin olduğu dışında, konumlarınıda öğrenmemizi gerektiren pek çok durum vardır. Mesela otonom araç etrafındaki nesneleri konumları ile tanıya bilmelidir ki çarpışma olmaksızın hareket edebilsin. Resimde konum belirlemenin iki şekli var.
Yukarda resimde görüldüğü gibi köpeğe, kediye, ve kanepeye ait pikseller ayrıştırılmış. Peki Nasıl yapılıyor ?
Görüntü sınıflandırma için CNN yapsından bahsetmiştik. ( bakınız )
Yıllardır görüntü bazlı problemler için CNN in eline su dökebilecek bir metod çıkmadı. Ağ yapılarında düzenlemeler, yeniliklerle , kendi kendiyle yarıştı. Ağın genel yapısı yukarda gördüğünüz gibidir. Kabaca giriş resmi üzerinde uygulanan konvolüsyon katmanları ile öznitelik çıkarma, sondaki YSA katmanları ile çıkarılmış özniteliklerden sınıflandırmayı öğrenme işlemi yapılmaktaydı. Semantik bölütleme içinde bu yapıdan faydalanıldı.
Yukarda görüdüğünüz şekilde bir ağ yapısı oluşturuldu. CNN den farklı olarak, baştan sona konvolüsyon katmanları kullanıldı. Bu yeni tip Ağ yapısıda Fully Convolutional Networks olarak adlandırıldı. YSA yerine geçen katmanlarla, ağın çıkışı ebatları girişiyle aynı hale getirildi. Ek olarak ayrıştıracağı sınıf sayısı kadar kanala sahip bir matris üretildi. Mesela 5 sınıfa ait bir bölütleme işlemi yaptığımızı varsayalım
Çıktıyı iki şekilde düşünebiliriz.
Giriş resminin hep pikseli için sınıflandırma sonuç vektörü. yani HxW tane 5 lik vektör
Her sınıf için piksellerin o sınıfa ait olma ihtimalini gösterer Matrisler
İşin teferruatları ve terorisi için aşağıdaki makaleleri incelemenizi tavsiye ediyoruz
Makalelerde geçen FCN-32s, FCN-16s ve FCN-8s tabirlerinin sizin ne ifade ettiğini
yukardaki resimle gösterelim. Bölütleme kesinliği sondaki sayı ile ters orantılı. Gerçek bölütleme sonucuna en uygun sonuçlar FCN-8s ile elde ediliyor.
Gelelim bizim uygulamamıza. FCN ağ yapısının caffe kütüphanesi ile uygulanmış olduğu açık kaynak kodlu proje sayası var.
Bu sayfa sizi bir github sayfasına yönlenidir. Orada değişik veri setleri ve için değişik ağ yapılara ve modellere ulaşabilirsiniz
Biz örneğimiz için 'fcn8s-heavy-pascal' model tanım ve ağırlık dosyalarını indirdik
Bisiklet sınıfı için ihtimal görüntüsü
Bölütleme sonucuda
Bisiklet için
Köpek İçin
gibi görünmektedir. Sonuç olarak bıyık filtrresinin ! :) çıkardığı aksilik dışında gayet iyi çalışıyor.
Kodun içine elimizden geldiğince açıklama satırlarıda koyduğumuzdan burda ek açıklama yapmaya gerek duymadık. Kod için bakınız
Yinede anlaşılmayan yerler varsa, yada bu konularda görüş ve önerileriniz varsa iletişime geçebilirsiniz.
- Kutu içerisine alma
- Semantik Bölütleme - Sematic Segmentation -
Yukarda resimde görüldüğü gibi köpeğe, kediye, ve kanepeye ait pikseller ayrıştırılmış. Peki Nasıl yapılıyor ?
Görüntü sınıflandırma için CNN yapsından bahsetmiştik. ( bakınız )
Yıllardır görüntü bazlı problemler için CNN in eline su dökebilecek bir metod çıkmadı. Ağ yapılarında düzenlemeler, yeniliklerle , kendi kendiyle yarıştı. Ağın genel yapısı yukarda gördüğünüz gibidir. Kabaca giriş resmi üzerinde uygulanan konvolüsyon katmanları ile öznitelik çıkarma, sondaki YSA katmanları ile çıkarılmış özniteliklerden sınıflandırmayı öğrenme işlemi yapılmaktaydı. Semantik bölütleme içinde bu yapıdan faydalanıldı.
Yukarda görüdüğünüz şekilde bir ağ yapısı oluşturuldu. CNN den farklı olarak, baştan sona konvolüsyon katmanları kullanıldı. Bu yeni tip Ağ yapısıda Fully Convolutional Networks olarak adlandırıldı. YSA yerine geçen katmanlarla, ağın çıkışı ebatları girişiyle aynı hale getirildi. Ek olarak ayrıştıracağı sınıf sayısı kadar kanala sahip bir matris üretildi. Mesela 5 sınıfa ait bir bölütleme işlemi yaptığımızı varsayalım
HxWx3 ( RGB ) -----> FCN -----> HxWx5
Çıktıyı iki şekilde düşünebiliriz.
Giriş resminin hep pikseli için sınıflandırma sonuç vektörü. yani HxW tane 5 lik vektör
Her sınıf için piksellerin o sınıfa ait olma ihtimalini gösterer Matrisler
İşin teferruatları ve terorisi için aşağıdaki makaleleri incelemenizi tavsiye ediyoruz
- Fully Convolutional Networks for Semantic Segmentation 2015
- Fully Convolutional Networks for Semantic Segmentation 2016
Makalelerde geçen FCN-32s, FCN-16s ve FCN-8s tabirlerinin sizin ne ifade ettiğini
yukardaki resimle gösterelim. Bölütleme kesinliği sondaki sayı ile ters orantılı. Gerçek bölütleme sonucuna en uygun sonuçlar FCN-8s ile elde ediliyor.
Gelelim bizim uygulamamıza. FCN ağ yapısının caffe kütüphanesi ile uygulanmış olduğu açık kaynak kodlu proje sayası var.
http://fcn.berkeleyvision.org
Bu sayfa sizi bir github sayfasına yönlenidir. Orada değişik veri setleri ve için değişik ağ yapılara ve modellere ulaşabilirsiniz
Biz örneğimiz için 'fcn8s-heavy-pascal' model tanım ve ağırlık dosyalarını indirdik
- fcn8s-heavy-pascal.prototxt
- fcn8s-heavy-pascal.caffemodel
Bisiklet sınıfı için ihtimal görüntüsü
Bölütleme sonucuda
Bisiklet için
Köpek İçin
gibi görünmektedir. Sonuç olarak bıyık filtrresinin ! :) çıkardığı aksilik dışında gayet iyi çalışıyor.
Kodun içine elimizden geldiğince açıklama satırlarıda koyduğumuzdan burda ek açıklama yapmaya gerek duymadık. Kod için bakınız
https://github.com/birolkuyumcu/ddm_blog_examples/tree/master/fcn-caffe
Yinede anlaşılmayan yerler varsa, yada bu konularda görüş ve önerileriniz varsa iletişime geçebilirsiniz.
Cuma, Mart 03, 2017
Keras'a Giriş - 2 ( LSTM )
Ocak ayında ilk yazısını yayınladığımız Keras 'a Giriş dizisine devam ediyoruz.
İlk yazımızda Kerasın kurulumunu, ve ana kullanım fonksiyonlarını anlatmıştık. Hali hazırda Kerasın içinde pek çok değişik katman bulunmaktadır. Katmanlarla ilgili kısımı okuyarak bunlara aşina olabilirsiniz. Katmanları bir birine ekleyerek kendi probleminize göre envai çeşit yapıyı tasarlayabilirsiniz.
Biz bu yazımızda Keras üzerinde LSTM ile zaman serisi tahmini yapan bir uygulama geliştireceğiz.
Açıklamaya RNN yani Recurrent Neural Networks ile başlamamız gerekiyor. Tarihi çok eskilere giden bir YSA yapısı. Aslında anlaması çok da kolay.
YSA yapımızda verdiğimiz verilerin saklı katmandan ürettiği çıktış sinyalini başa alıp bir sonraki giriş de giriş değerlerinden biri olarak kullanıyoruz.
Bu ne işimize yarıyor diye soracak olursanız pek çok durumda verilerimiz de bir sıralılık bağlantısı vardır. sadece girdiklerimiz değil bir önceki durumda çıkışa etki ediyordur. Bu tip Sıralılık örüntüsü - Sequence pattern - içeren durumlar için bu tip YSA yapıları daha başarılı bir modelleme imkanı sağlamaktadır.
Peki yıllardır bilinen bu yapı niye populer olamamış ? Bu sorunun cevabı olarak meşhuuur Vanishing gradient problem çıkıyor karşımıza. YSA eğitiminde giriş verileriyle çıkış değerleri hesaplanır. Hesaplanmış çıkış değerleri ile gerçek değerler karşılaştırılır ve farklılık bize bir meyil - gradient - Bu meyile göre geriye doğru ağ ağırlık değerlerinde güncelleme yapılır. Ağımız çok karmaşıksa geriye doğru meyil değerleri sıfırlanır. Meyil olmazsada güncelleme olmaz ve eğitilmeside durmuş olur. RNN yapısında da zaman içinde geriye doğru bağlılık var. Ağımızı eğitim açısında çok karmaşık hale getiriryor.
Bu problemin çözümü için LSTM - Long short-term memory - denen bir yapı kurulmuş.
Yukardaki akıllara ziyan şemadan da anlaşılacağı üzere çok kompleks bir sistem. Yapıda kabaca RNN hücresine birde hafıza eşlik ediyor. Bu hafıza ile bir önceki zamandan gelen bilgi alınabiliyor , bir sonrakine iletilebiliyor. Neyi alıp neyi almayacağına eğitim ile karar veriyor. Konunun teferruatları için, Ve illede iç yüzünü öğreneceğim diyenler için bir kaç link verip geçiyorum
1) Deep Learning Lecture 12: Recurrent Neural Nets and LSTMs
2) Understanding LSTM Networks
3) The Unreasonable Effectiveness of Recurrent Neural Networks
ilki zaten adından anlaşılıyor. LSTM den yukarda bahsettik . sonuncusu GRU - Gated Recurrent Unit - daha LSTM benzeri yeni bir sistem
Biz LSTM i kullanacağız. ondan bahsedelim
LSTM ler genel anlamda sequence zaman sıralı şekilde gelen veriler üzerinden çalışırlar.
Olmaz ama soran olursa diye buraya yazayım peşin peşin, pek çok değişik kaynakda pek çok değişik notasyon var. Kullanımında benim tercihim bu şekilde oldu.
Daily maximum temperatures in Melbourne, Australia, 1981-1990
Avusturalya Melbornda 10 yıllık bir sürede ( 1981-1990 ) günlük olarak ölçülmüş en yüksek sıcaklıkları gösteriyor.
Yukardaki grafikden de anlaşılacağı üzre oldukça gürültülü bir sin fonksiyonu
Bizde son 5 günün en sıcaklık değerlerini kullanarak yarınki en yüksek sıcaklık değerini hesaplattırmaya çalışacağız. uygulamızda
önce verimizi pandas ile yüklüyoruz
tarih ve en yükseklik sıcaklığı tutan iki sutun var tarih bize lazım değil sadece en yüksek sıcaklık değerleriniz çekiyoruz.
YSA eğitimlerinde verileri ölçeklendirmek genellikle faydalı olur. bizde ( 0 , 1 ) arası bir ölçeklendirme işlemi uyguluyoruz.
Bu veri üzerinde kayan pencere metoduyla ağımızı eğitmek için veris seti oluşturuyoruz
Önce giriş ve çıkış verilerimizi oluşturuyoruz X ve Y olarak
ilk kutuda kayan pencere metoduyla giriş ve çıkışları seçip X ve Y adında iki listeye atıyoruz.
ikinci kutuda listeleri Martise dönüştürüyoruz.
Üçüncü kutuda giriş verimizi LSTM in istediği formata çevrimek için bir dönüşüm yapıyoruz
çünkü öncesinde giriş matris ebadı (nb_samples, timesteps) şeklinde bir giriş veri boyutunu 1 olarak verip (nb_samples, timesteps , 1 ) ebadına dönüştürüyoruz.
3645 adet verimiz var. Biz 3200 'ünü eğitim için kullanıyoruz geri kalanınıda test için bırakıyoruz.
Evet sıra geldi Ağımızı oluşturmaya
İki LSTM katmanı oluşturuyoruz ilki giriş katmanı çıkışı 64 kendinden sonra yine bir LSTM katmanına bağlanacağından return_sequence değişkenine True değerini veriyoruz.
LSTM katmanı sonrasında 0.2 lik bir Dropout katmanı koyuyoruz. Dropout en basit ifade ile sistemin ezberlemesini önlemeye çalışan bir katmandır. biraz detay isterseniz daha önceki yazılarımda kısaca bahsetmiştim ordan bakabilirsiniz.
İkinci LSTM katmanının 32 çıkışı var yine peşine Dropout katmanı kondu. Perşinede Çıkış katmanı olarak normal bir YSA katmanı -Dense- kullanıyoruz. Bir çıkış yani takip eden günün en yüksek sıcaklığı olduğundan çıkışı 1 .
model sınıfının summary fonksiyonu ile modelimizin yapısını ve katmanların çıkış ebatlarını parametre sayılarını görebiliyoruz.
Bir katmanın girişi kendinden öncekinin çıkışı olduğunda girişleri göstermesine gerek olmuyor.
Eğitime başlatıyoruz.
Eğitim sonunda Test verisinden başlangıcını rastgele seçeceğimiz 100 adet veri seçiyoruz. Bu veri için Gerçek değer. Tahmin edilen değer. Bir de sadece seçtiğimiz aralığın başlangıç değerini alıp ileriye doğru zincirleme tahmin hesaplattırarak grafikler çizdiriyoruz.
Grafik den görüklerimizi yorumlayalım.
Ipython dosyasına ve veriye burdan ulaşabilirsiniz.
Bundan sonra tavsiyem, ağın yapısı , parametreleri, hatta pencere ebatları ile oynayarak ne şekilde sonuçlara ulaşılabiliyor görmenizdir.
Eleştiri, öneri yada sorularınız olursa bekleriz...
İlk yazımızda Kerasın kurulumunu, ve ana kullanım fonksiyonlarını anlatmıştık. Hali hazırda Kerasın içinde pek çok değişik katman bulunmaktadır. Katmanlarla ilgili kısımı okuyarak bunlara aşina olabilirsiniz. Katmanları bir birine ekleyerek kendi probleminize göre envai çeşit yapıyı tasarlayabilirsiniz.
Biz bu yazımızda Keras üzerinde LSTM ile zaman serisi tahmini yapan bir uygulama geliştireceğiz.
LSTM nedir ?
Büyük soru, başta kendim olmak üzere kafamızı çok karıştırmadan mümkün mertebe sade anlatmaya çalışalım.Açıklamaya RNN yani Recurrent Neural Networks ile başlamamız gerekiyor. Tarihi çok eskilere giden bir YSA yapısı. Aslında anlaması çok da kolay.
YSA yapımızda verdiğimiz verilerin saklı katmandan ürettiği çıktış sinyalini başa alıp bir sonraki giriş de giriş değerlerinden biri olarak kullanıyoruz.
Bu ne işimize yarıyor diye soracak olursanız pek çok durumda verilerimiz de bir sıralılık bağlantısı vardır. sadece girdiklerimiz değil bir önceki durumda çıkışa etki ediyordur. Bu tip Sıralılık örüntüsü - Sequence pattern - içeren durumlar için bu tip YSA yapıları daha başarılı bir modelleme imkanı sağlamaktadır.
Peki yıllardır bilinen bu yapı niye populer olamamış ? Bu sorunun cevabı olarak meşhuuur Vanishing gradient problem çıkıyor karşımıza. YSA eğitiminde giriş verileriyle çıkış değerleri hesaplanır. Hesaplanmış çıkış değerleri ile gerçek değerler karşılaştırılır ve farklılık bize bir meyil - gradient - Bu meyile göre geriye doğru ağ ağırlık değerlerinde güncelleme yapılır. Ağımız çok karmaşıksa geriye doğru meyil değerleri sıfırlanır. Meyil olmazsada güncelleme olmaz ve eğitilmeside durmuş olur. RNN yapısında da zaman içinde geriye doğru bağlılık var. Ağımızı eğitim açısında çok karmaşık hale getiriryor.
Bu problemin çözümü için LSTM - Long short-term memory - denen bir yapı kurulmuş.
Yukardaki akıllara ziyan şemadan da anlaşılacağı üzere çok kompleks bir sistem. Yapıda kabaca RNN hücresine birde hafıza eşlik ediyor. Bu hafıza ile bir önceki zamandan gelen bilgi alınabiliyor , bir sonrakine iletilebiliyor. Neyi alıp neyi almayacağına eğitim ile karar veriyor. Konunun teferruatları için, Ve illede iç yüzünü öğreneceğim diyenler için bir kaç link verip geçiyorum
1) Deep Learning Lecture 12: Recurrent Neural Nets and LSTMs
2) Understanding LSTM Networks
3) The Unreasonable Effectiveness of Recurrent Neural Networks
Keras da RNN katmanlar
Hali hazırda Keras kütüphanesinde 3 çeşit RNN katmanı var.ilki zaten adından anlaşılıyor. LSTM den yukarda bahsettik . sonuncusu GRU - Gated Recurrent Unit - daha LSTM benzeri yeni bir sistem
Biz LSTM i kullanacağız. ondan bahsedelim
LSTM ler genel anlamda sequence zaman sıralı şekilde gelen veriler üzerinden çalışırlar.
keras.layers.recurrent.LSTM(output_dim,eğer LSTM ilk katmansa batch_input_shape verilmesi gerekiyor ve dökümanda geçen şekli
batch_input_shape=(nb_samples, timesteps, input_dim),
return_sequences=False,....)
- nb_samples : veri sayımız, None diyede verebiliyoruz.
- timesteps : LSTM e vereceğimiz veriler zaman bazında değişen aynı türdeki veriler kaç birim zamanlık veri verilecek burda onu belirtmemiz gerekiyror
- input_dim : giriş verimizin boyutu.
- return_sequences : Kendinden sonraki katman Yine Bir LSTM olacaksa True yapılacak
- output_dim : Katman çıkış boyutu ve LSTM birim sayısı. Ağın çıkışı , eğer kendinden sonraki katman Yine Bir LSTM olacaksa (nb_samples, timesteps, output_dim) , olmayacaksa (nb_samples, , output_dim) olur.
Olmaz ama soran olursa diye buraya yazayım peşin peşin, pek çok değişik kaynakda pek çok değişik notasyon var. Kullanımında benim tercihim bu şekilde oldu.
Uygulama
Keras da LSTM uygulamamız için bir zaman serisi verisi seçtik.Daily maximum temperatures in Melbourne, Australia, 1981-1990
Avusturalya Melbornda 10 yıllık bir sürede ( 1981-1990 ) günlük olarak ölçülmüş en yüksek sıcaklıkları gösteriyor.
Yukardaki grafikden de anlaşılacağı üzre oldukça gürültülü bir sin fonksiyonu
Bizde son 5 günün en sıcaklık değerlerini kullanarak yarınki en yüksek sıcaklık değerini hesaplattırmaya çalışacağız. uygulamızda
önce verimizi pandas ile yüklüyoruz
tarih ve en yükseklik sıcaklığı tutan iki sutun var tarih bize lazım değil sadece en yüksek sıcaklık değerleriniz çekiyoruz.
YSA eğitimlerinde verileri ölçeklendirmek genellikle faydalı olur. bizde ( 0 , 1 ) arası bir ölçeklendirme işlemi uyguluyoruz.
Bu veri üzerinde kayan pencere metoduyla ağımızı eğitmek için veris seti oluşturuyoruz
Önce giriş ve çıkış verilerimizi oluşturuyoruz X ve Y olarak
ilk kutuda kayan pencere metoduyla giriş ve çıkışları seçip X ve Y adında iki listeye atıyoruz.
ikinci kutuda listeleri Martise dönüştürüyoruz.
Üçüncü kutuda giriş verimizi LSTM in istediği formata çevrimek için bir dönüşüm yapıyoruz
çünkü öncesinde giriş matris ebadı (nb_samples, timesteps) şeklinde bir giriş veri boyutunu 1 olarak verip (nb_samples, timesteps , 1 ) ebadına dönüştürüyoruz.
3645 adet verimiz var. Biz 3200 'ünü eğitim için kullanıyoruz geri kalanınıda test için bırakıyoruz.
Evet sıra geldi Ağımızı oluşturmaya
İki LSTM katmanı oluşturuyoruz ilki giriş katmanı çıkışı 64 kendinden sonra yine bir LSTM katmanına bağlanacağından return_sequence değişkenine True değerini veriyoruz.
LSTM katmanı sonrasında 0.2 lik bir Dropout katmanı koyuyoruz. Dropout en basit ifade ile sistemin ezberlemesini önlemeye çalışan bir katmandır. biraz detay isterseniz daha önceki yazılarımda kısaca bahsetmiştim ordan bakabilirsiniz.
İkinci LSTM katmanının 32 çıkışı var yine peşine Dropout katmanı kondu. Perşinede Çıkış katmanı olarak normal bir YSA katmanı -Dense- kullanıyoruz. Bir çıkış yani takip eden günün en yüksek sıcaklığı olduğundan çıkışı 1 .
model sınıfının summary fonksiyonu ile modelimizin yapısını ve katmanların çıkış ebatlarını parametre sayılarını görebiliyoruz.
Bir katmanın girişi kendinden öncekinin çıkışı olduğunda girişleri göstermesine gerek olmuyor.
Eğitime başlatıyoruz.
Eğitim sonunda Test verisinden başlangıcını rastgele seçeceğimiz 100 adet veri seçiyoruz. Bu veri için Gerçek değer. Tahmin edilen değer. Bir de sadece seçtiğimiz aralığın başlangıç değerini alıp ileriye doğru zincirleme tahmin hesaplattırarak grafikler çizdiriyoruz.
Grafik den görüklerimizi yorumlayalım.
- Tahmin ve gerçek değer arasında Müthiş bir sayısal yakınlık yok.
- Sayısal doğruluk gibi bir bekleti bu tip bir zaman serisi için pekde mümkün değildi
- Fakat Grafiklerdeki inişve çıkışlar parelellikler içeriyor. Sequence learning kavramı hatırlayın
- Zincirleme ileriye doğru tahmin ilk başta çalışsada sonrasında bir rakama sabitleniyor.
- Bu da beklediğimiz bir durum bakınız kaos teorisi
Ipython dosyasına ve veriye burdan ulaşabilirsiniz.
https://github.com/birolkuyumcu/high_temp_lstm
Bundan sonra tavsiyem, ağın yapısı , parametreleri, hatta pencere ebatları ile oynayarak ne şekilde sonuçlara ulaşılabiliyor görmenizdir.
Eleştiri, öneri yada sorularınız olursa bekleriz...
Etiketler:
derin öğrenme,
keras,
LSTM,
python,
yapay sinir ağları,
yapay zeka
Cumartesi, Ocak 28, 2017
Türkiyede Terör
Bizde bu veritabanından ülkemizde gerçekleşen eyemleri gösterelim dedik.
Teror from bluekid on Vimeo.
Yukardaki haritada 1970 den 2015 in sonuna kadar gerçekleşen eylemler harita üzerinde gösterilmiştir.
Veritabanında Türkiyede geçen 3557 eylem var. Bu eylemleri gerçekleştiren 90 örgüt var. Faili meçhuller de var elbette.
Yıllara göre Gerçekleştirilen eylem sayısı ve ölümler
En çok eylemin olduğu yıllar ve eylem sayıları
Eylemlerde ölen insan sayılarına baktığımızda yıllara göre en yüksek 101992 514 2015 416 1994 300 1991 293 1990 195 2012 189 1977 189 1979 141 1995 133 1989 114
Örgütler Eyemlerine göre sıralarsak Yüzde olarak1992 1233.0 1994 982.0 1990 512.0 2015 490.0 1991 308.0 2012 248.0 1989 232.0 1995 189.0 1987 187.0 1999 127.0
PKK % 45 ile en fazla eylem yapan örgüt olmuş. İşin ilginci ikinci sırada % 36 ile faili meçhul eylemler geliyor.
IŞİD 'in eylem sayısı yüzdesi az olduğuna bakmayın En kanlı eylemler sırasında PKK ile başa baş gidiyorlar.
Son olarak 10 ar yıllık periyotlarda göre yine harita üzerinden fakat Ölüm sayısına göre çember büyüklüklerini değişterek çizdirdiğimiz haritalara göz atın. ilk yıl dahil son yıl dahil değil şeklinde
Elbette son haritamızda mecburen 5 yıllık bir veri var. Ama malesef 10 yılları aratmıyor
Son olarak; Biz burda Dünya çapında hazırlanmış genel bir veritabanı kullandık. Ülke yöneticilerimizin ulaşabilecekleri çok daha detaylı veriler olduğu aşikardır.
Malum ölçemediğiniz şeyi düzeltemezsiniz de, yönetemezsiniz de. Bi-zahmet inceleyip gereken çıkarımları yapsınlar
Not : Bütün işlemler python kullanılarak yapıldı. Kaggle daki sayfada örnekleri görebilirsiniz. Bende ordaki kodlardan faydalanıp yazdım zaten. Patron duymadan alel acele bloga yazı yazdığımdan ipython-notebook 'u düzenleyip yayınlıyamadım. Kusuruma bakmayın.
Salı, Ocak 17, 2017
Keras 'a Giriş - 1
Merhaba 2017 yılının ilk yazısıyla karşınızdayız. Yazımız Keras hakkında. Eğer derin öğrenme alanındaki kütüphanelerden en beğendiklerimi listelemem gerekse iki numarada keras gelir. yeri gelmişken ilk üçüde yazalım (Caffe , Keras , Mxnet.) Neyse konuyu dağıtmayayım
Aslında yazının bu ilk bir kısmı epeydir hazırdı. Bazı düzeletmeler gerekiyordu ve devamı niteliğinde uygulamalı bir şeyler de yazamam gerekiyordu. Bu yüzden bekletiyordum. Eğitimde bu haliyle bile ihtiyaç olduğunu gördüğümden yayınlıyorum. İnşallah devamını yazma imkanınıda bulabilirim. Her türlü görüş öneri ve eleştirilerinizi bekleriz.
Visual Studio - VS2013 comunity -
Cuda Kütüphanesi
CuDNN kütüphanesini
Kurulmuş olsun
Kaynak koddan derlmek zor iş bu yüzden binary paket buluyoruz.
Aslında yazının bu ilk bir kısmı epeydir hazırdı. Bazı düzeletmeler gerekiyordu ve devamı niteliğinde uygulamalı bir şeyler de yazamam gerekiyordu. Bu yüzden bekletiyordum. Eğitimde bu haliyle bile ihtiyaç olduğunu gördüğümden yayınlıyorum. İnşallah devamını yazma imkanınıda bulabilirim. Her türlü görüş öneri ve eleştirilerinizi bekleriz.
Keras
Nedir
Keras, derin öğrenme
için yazılmış bir python kütüphanesidir. Yine sembolik işlem
temelli ve derin öğrenme için de kullanılan Theano yada
Tensorflow kütüphaneleri üzerinden çalışır. GPU yada CPU
üzerinde çalışmasını bu temel kütüphaneler üzerinden sağlar.
Daha üst düzey bir kütüphane olduğundan Theano yada Tensorflow
a göre daha kolay uygulama geliştirebilirsiniz. Oldukça yaygın
bir kullanımı vardır hatta Kaggle yarışmalarında problem ile
ilgili yazılmış pekçok örnek bulabilirsiniz.
Kurulumu
Biz temel aldığı
kütüphanelerden Theano yu tercih ediyoruz çünkü Tensorflow hali
hazırda Windows desteği yok. GPU desteği için de pyCuda
paketinin kurulması lazım.
PyCuda
kurulumu :
Python – önerimiz Anaconda dağıtımı -Visual Studio - VS2013 comunity -
Cuda Kütüphanesi
CuDNN kütüphanesini
Kurulmuş olsun
Kaynak koddan derlmek zor iş bu yüzden binary paket buluyoruz.
http://www.lfd.uci.edu/~gohlke/pythonlibs/#pycuda
bu adresten binary
whl dosyasını -sisteminize göre seçerek - indirin
pycuda-2016.1.2+cuda7518-cp27-cp27m-win_amd64.whl
mesela bu dosya 64
bit ve python 2.7 için olandır.
Bu paket aslında
sıkıştırımış bir dosyadır 7zip ile açtın
içindeki dizinleri
Pythonun paketlerinin bulunduğu dizine mesela
c:/anaconda2/lib/site-packages/
dizinine atın
Eğer verilmemişse
VS derleyicisinin yolunu path a ekleyin - nvcc için gerekiyor -
Theano
Kurulumu :
Theanoyu github dan
klonlayın
https://github.com/Theano/Theano
Komut satrından
Theanoyu klonladığınız dizine geçin
python setup.py install
System ->
Gelişmiş Sistem Ayarlarından -> Ortam Değişkenlerinden
değişken tanımlayın
THEANO_FLAGS
floatX=float32,device=gpu,nvcc.fastmath=True
kapatıp açın
cuDNN kütüphanesinin
Theano nun kullanıma açılmasının en kolay yolu cuDNN
kütüphanesini CUDA kütüphanesini kurduğunuz yere açmaktır.
Eğer cuDNN kütüphanesini bulmazsa ilk başta cuDNN disabled diye
yazar
Keras
Kurulumu :
Kerası github dan
klonlayın
https://github.com/fchollet/keras
Komut satrından
Keras klonladığınız dizine geçin
python setup.py install
Bu adımlarda bir
problem çıkmadı ise kurulumunuz tamamlanmıştır.
Keras
API Yapısı
Keras da iki ana API
yapısı vardır. Kurcağınız modelleri bu iki yapıdan birini
kullanarak tasarlayabiliyoruz. Sequential yapıda modellerimiz
katmnlar şekilde tasarlamak zorundayız. Fakat Kullanımı daha
sade ve anlaşılır bir yapıdır. Functional yapıda ise
fonksiyonlar şeklinde tasarlanıyor. Çok daha esnek ve gelişkin
modeller tasarlamamıza imkan sağlıyor.
Sequential
API
Katmanlar şeklinde
modelimizi oluşturacağımız bir yapı olduğunu söyledik. Genel
Kullanımı şekli aşağıdaki gibidir.
model = Sequential()model.add(Layer1(..., input))....model.add(LayerN(...))model.add(Dense(output))model.add(Activation(...))model.compile(...)model.fit(...)
Giriş
:
Model dediğimiz
yapıda Giriş katmanı verimizi vermek için kullanılacağından.
Verinin giriş büyüklüğünün belirtilmesi zorunludur. Diğer
katmanlar kendilerinden önce gelen katmandan çıkan veriyi
aldığından onlar için belirtilmesine gerek yoktur.
Giriş Veri
büyüklüğü bir kaç değişik şekilde ( input_dim , input_shape
, input_length ,
batch_
input_shape ) yapılabilir.
model.add(Dense(64,input_dim=20,...))
model.add(Convolution2D(....input_shape=(3, 100, 100)))model.add(Dense(32,batch_input_shape=(None, 784)))# note that batch dimension is "None" here,# so the model will be able to process batches of any size.model.add(Embedding(...,input_length=maxlen))
Çıkış
:
Çıkış katmanında
da sonuçları almak için çıkış büyüklüğü belirlenmelidir.
Çıkış büyüklüğü genellikle son aktivasyon katmanından
önceki katmanın çıkış ebatıdır.
model.add(Dense(10))model.add(Activation('softmax'))
mesela bu örnekde 10 çıkış değeri olması gerektiği
belirtiliyor.
Compile
:
Model tanımlaması
yapıldıktan sonra. Eğitim öncesi bu fonksiyonu çağırmak
zorundayız. Bu fonksiyon ile ağın eğitilmesi için kullanılacak
optimizasyon fonkisyonu eğitimin durumunu ve ölçümünü veren
parametreler verilir.
model.compile(optimizer=... , loss=...,
metrics=[...])
Optimizasyon
Fonksiyonları :
Optimizasyon
fonksiyonunu optimizer paremetresine iki şekilde eşitleyerek
belirtiriz.
-
Optimizasyon fonksiyonun ismini string olarak verip varsayılan parametreleri ile çağırarak
-
Kendi istediğimiz parametrelerle Optimizasyon nesnelerinden birini oluşturarak
Örnekleyelim :
# pass optimizer by name: default parameters will be used
model.compile(loss='mean_squared_error', optimizer='sgd')
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd)
Kullanabileceğimiz
Optimizasyon metodları şunlardır
-
'sgd': SGD
-
'rmsprop': RMSprop
-
'adagrad': Adagrad
-
'adadelta': Adadelta
-
'adam': Adam
-
'adamax': Adamax
-
'nadam': Nadam
Metdolar Hakkındadki
detaylar ise şunlardır. Açıklamalardan da anlaşılabileceği
gibi Varsayılan değerleri kullanmak en emniyetli yoldur.
SGD
keras.optimizers.SGD(lr=0.01,
momentum=0.0, decay=0.0, nesterov=False)
Stochastic gradient
descent, with support for momentum, learning rate decay, and Nesterov
momentum.
Arguments
lr: float >=
0. Learning rate.
momentum: float
>= 0. Parameter updates momentum.
decay: float >=
0. Learning rate decay over each update.
nesterov:
boolean. Whether to apply Nesterov momentum.
RMSprop
keras.optimizers.RMSprop(lr=0.001,
rho=0.9, epsilon=1e-08)
RMSProp optimizer.
It is recommended to
leave the parameters of this optimizer at their default values
(except the learning rate, which can be freely tuned).
This optimizer is
usually a good choice for recurrent neural networks.
Arguments
lr: float >=
0. Learning rate.
rho: float >=
0.
epsilon: float
>= 0. Fuzz factor.
Adagrad
keras.optimizers.Adagrad(lr=0.01,
epsilon=1e-08)
Adagrad optimizer.
It is recommended to
leave the parameters of this optimizer at their default values.
Arguments
lr: float >=
0. Learning rate.
epsilon: float
>= 0.
References
Adadelta
keras.optimizers.Adadelta(lr=1.0,
rho=0.95, epsilon=1e-08)
Adadelta optimizer.
It is recommended to
leave the parameters of this optimizer at their default values.
Arguments
lr: float >=
0. Learning rate. It is recommended to leave it at the default value.
rho: float >=
0.
epsilon: float
>= 0. Fuzz factor.
References
Adam
keras.optimizers.Adam(lr=0.001,
beta_1=0.9, beta_2=0.999, epsilon=1e-08)
Adam optimizer.
Default parameters
follow those provided in the original paper.
Arguments
lr: float >=
0. Learning rate.
beta_1/beta_2:
floats, 0 < beta < 1. Generally close to 1.
epsilon: float
>= 0. Fuzz factor.
References
Adamax
keras.optimizers.Adamax(lr=0.002,
beta_1=0.9, beta_2=0.999, epsilon=1e-08)
Adamax optimizer
from Adam paper's Section 7. It is a variant of Adam based on the
infinity norm.
Default parameters
follow those provided in the paper.
Arguments
lr: float >=
0. Learning rate.
beta_1/beta_2:
floats, 0 < beta < 1. Generally close to 1.
epsilon: float
>= 0. Fuzz factor.
References
Nadam
keras.optimizers.Nadam(lr=0.002,
beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004)
Nesterov Adam
optimizer: Much like Adam is essentially RMSprop with momentum, Nadam
is Adam RMSprop with Nesterov momentum.
Default parameters
follow those provided in the paper. It is recommended to leave the
parameters of this optimizer at their default values.
Arguments
lr: float >=
0. Learning rate.
beta_1/beta_2:
floats, 0 < beta < 1. Generally close to 1.
epsilon: float
>= 0. Fuzz factor.
References
Loss
Fonksiyonları
Ağın eğitimi
esnasında Ağın ileri doğru çalışıp ürettiği çıkış
değerleri ile gerçek çıkış değerlerini karşılaştırıp.
Ağın eğitimesi için geri besleme degeri üreten fonksiyonlardır.
Detayları için
buraya
bakınız. Hali hazırda tanımlı fonksiyonlar aşağıdakilerdir.
-
mean_squared_error / mse
-
mean_absolute_error / mae
-
mean_absolute_percentage_error / mape
-
mean_squared_logarithmic_error / msle
-
squared_hinge
-
hinge
-
binary_crossentropy: Also known as logloss.
-
categorical_crossentropy: Also known as multiclass logloss. Note: using this objective requires that your labels are binary arrays of shape (nb_samples, nb_classes).
-
sparse_categorical_crossentropy: As above but accepts sparse labels. Note: this objective still requires that your labels have the same number of dimensions as your outputs; you may need to add a length-1 dimension to the shape of your labels, e.g with np.expand_dims(y, -1).
-
kullback_leibler_divergence / kld: Information gain from a predicted probability distribution Q to a true probability distribution P. Gives a measure of difference between both distributions.
-
poisson: Mean of (predictions - targets * log(predictions))
-
cosine_proximity: The opposite (negative) of the mean cosine proximity between predictions and targets.
Kullanımı
model.compile(loss='categorical_crossentropy',...)
şeklindedir.
Uygulamanıza özel
loss fonksiyonuda yazabilirsiniz
Metric
:
Compile fonksiyonu
için gireceğimiz son parametre metric parametresidir. Fakat Hali
hazırda kodlanmış alternatif çeşitler yoktur yegane seçeneğiniz
‘accuracy’ dir. Size 0-1 arasında bir doğruluk değeri
gösterir. Her sınıf için aynı sayıda verimiz varsa oldukça
başarılı bir ölçüttür
fakat her sınıf
için çok farklı sayıda örnek varsa çok başarılı bir gösterge
olmaz.
model.compile(optimizer=... , loss=...,
metrics=[‘accuracy’])
şeklinde
kullanılır.
Eğitim
Fonksiyonu ( Fit ) :
Yapısı
tanımlanmış ve compile işlemi yapılmış ağların eğitimi için
model sınıfının fit fonksiyonu çağrılır. Önce Fonksiyonun
tanımlamasına bakalım
fit( x, y, batch_size=32, nb_epoch=10,
verbose=1, callbacks=[],
validation_split=0.0, validation_data=None,
shuffle=True,
class_weight=None, sample_weight=None)
Ağı sabit bir
iterasyon sayısınca eğitir.
Parametreler
x:
Giriş verisi Numpy dizisi yada Numpy dizilerini tutan liste (Eğer
Ağın çoklu girişi varsa).
y:
Giriş verisine ait Etiketler Numpy dizisi
batch_size:
Bir ileri çalışma ve geri yayılma esnasında kullanılacak örnek
sayısı Tamsayı
nb_epoch:
iterasyon sayısı Bütün veri setinin kaç kez tekrar eğitimde
kullanılacağı
verbose:
eğitim esnasında verilecek ilerleme bilgisini ayarlayan parametre
0 : stdout a bir çıkış yok
1 : ilerleme çubuğuyla göster ‘[=====>............]’
2 : her iterasyon için tek ilerleme çubuğu gösterir
callbacks:
Eğitim esnasında çalışıtırılan fonksiyonlar bakınız
callbacks
validation_split: (0. < x < 1). bir oran da verinin
bir kısmını eğitimde kullanmayıp doğrulama -validation – için
kullanılır. Meseala 0.2 demek Eğitim verisinin %20 sinin doğrulama
işlemi için kullanılacağı anlamına gelir.
validation_data:
Doğrulama için Eğitim verisinden ayrı olarak veride verebiliriz
bu şekilde tuple tipinde (X, y) Eğitim verisindeki Gibi X giriş
Y etiketleri tuan Numpy dizileridir.
shuffle:
Her iterasyonda eğitim verisinin sırasının karıştırılmasını
sağlar True ise
class_weight:
Eğitim esnasında loss hesaplanırken her sınıf için ayrı
ağırlık parametresi dict tipinde
sample_weight:
Eğitim veri setinde loss hesabında her örnek için ayrı bir
katsayı kullanımına imkan verir
Fonksiyon
Dönüşdeğeri
History Nesnesi
döner Eğitim esnasındaki hemen herşeyi tutar. ( eğitim ve
doğrulama için loss ve metrik değerler vs...)
Cumartesi, Kasım 26, 2016
Instagram Hesap Analizi 2
Evet cem yılmazın instagram sayfasını analiz ediyorduk. Devam edelim.
Beğeni ve yorum sayılarında zamanla bir değişim olmuşmudur diye bakalım. Cem yılmazın instagram hesabında çok sık paylaşım olmadığından doğrudan zamanı kullanmak aldatıcı olur. Bu yüzden her 20 gönderi başına ortalama beğeni ve yorum sayısını hesaplayıp grafiğe döktük. Bizim çalışmamız yapıldığında 340 gönderisi vardı cem yılmazın 340/20 -> 17 tane veri noktası hesaplıyoruz.
Zaman İçinden beğeni sayısının değişimi
Zaman içinde yorum sayısının değişimi
Grafiklerden de belli olduğu gibi sayfanın başlangıcında yorumda beğenide nispeten azmış.
zamanla bu büyük bir artış göstermiş. muhtemelen zaman içinde cem yılmazın instagram sayfasının bilinirliğinin artması ve takipçilerinin çoğalması ile olmuştur.
Toplamda gönderi sayısının azlığı ve zaman içindeki değişim büyüklüğü gibi olumsuzluklar var. Bu zaman içindeki büyük değişim tahmin sistemini olumsuz etkileyeceği aşıkardır. Yinede biz Görsel olarak az beğenilen çok beğenilen ayrımını yapabilen bir sınıflandırıcı eğitmeye çalıştık.
Resimleri beğeni sayısına göre sıralayıp, en beğenilen 120 ve en az beğenilen 120 resmi iki ayrı sınıf için eğitmek için alıyoruz. Caffe ile bir fine-tune işlemi ile eğitiyoruz ve test ediyoruz.
Sonuç :
Sınıflandırıcımız ı 46 adet eğitimde kullanmadığımız gönderi ile test ediyoruz. Bu gönderilerin 23 tanesi az, 23 taneside çok beğenil olarak seçildi
Sınıflandırıcımız
Sınıflandırıcımız her iki sınıf içinde bir tahminde bulunur. her sınıfın ihtimalini verir. Toplamda 1 olan bu oranlardan yüksek olanını tahmin olarak kullanıyoruz.
Çok kaba bir beğeni sayısı tahmini yaparsak.
çok beğenilenlerin ortalama beğeni sayısı -> m_mean
az beğenilenlerin ortalma beğeni sayısı -> l_mean
resmin :
çok beğenilme ihtimali : m_prob
az beğenilme ihtimali : l_prob
beğeni tahmini = ( m_prob*m_mean ) + ( l_prob*l_mean )
Mesela :
gönderisi için sistemimiz 10 bin 127 beğeni alır demiş.
Tahmindeki sapmayı ise başta bahsettiğimiz olumsuzluklara, ilaveten de tahmin yöntemimizin çok kabalığına bağlıyorum. Siz nedersiniz bilmem ama bence yinde sonuç fena değil...
Daha çok gönderisi olan, takipçi durumu belli bir düzene girmiş hesaplar için daha başarılı çalışmalar yapılabilir.
Aslında görüntüler üzerinde kümelemelerde yapılıp onun üzeerinden de çıkarımlar yapılabilir. Şimdilik burda bitiriyoruz.
Her türlü görüş ve önerilerinizi bekleriz...
Beğeni ve yorum sayılarında zamanla bir değişim olmuşmudur diye bakalım. Cem yılmazın instagram hesabında çok sık paylaşım olmadığından doğrudan zamanı kullanmak aldatıcı olur. Bu yüzden her 20 gönderi başına ortalama beğeni ve yorum sayısını hesaplayıp grafiğe döktük. Bizim çalışmamız yapıldığında 340 gönderisi vardı cem yılmazın 340/20 -> 17 tane veri noktası hesaplıyoruz.
Zaman İçinden beğeni sayısının değişimi
Zaman içinde yorum sayısının değişimi
Grafiklerden de belli olduğu gibi sayfanın başlangıcında yorumda beğenide nispeten azmış.
zamanla bu büyük bir artış göstermiş. muhtemelen zaman içinde cem yılmazın instagram sayfasının bilinirliğinin artması ve takipçilerinin çoğalması ile olmuştur.
Toplamda gönderi sayısının azlığı ve zaman içindeki değişim büyüklüğü gibi olumsuzluklar var. Bu zaman içindeki büyük değişim tahmin sistemini olumsuz etkileyeceği aşıkardır. Yinede biz Görsel olarak az beğenilen çok beğenilen ayrımını yapabilen bir sınıflandırıcı eğitmeye çalıştık.
Resimleri beğeni sayısına göre sıralayıp, en beğenilen 120 ve en az beğenilen 120 resmi iki ayrı sınıf için eğitmek için alıyoruz. Caffe ile bir fine-tune işlemi ile eğitiyoruz ve test ediyoruz.
Sonuç :
Sınıflandırıcımız ı 46 adet eğitimde kullanmadığımız gönderi ile test ediyoruz. Bu gönderilerin 23 tanesi az, 23 taneside çok beğenil olarak seçildi
Sınıflandırıcımız
- 21 kez bu az beğenilir demiş 16 tanesi doğru sınıflandırılmış
- 25 kez çok beğenilir demiş 18 tanesi doğru sınıflandırılmış
Sınıflandırıcımız her iki sınıf içinde bir tahminde bulunur. her sınıfın ihtimalini verir. Toplamda 1 olan bu oranlardan yüksek olanını tahmin olarak kullanıyoruz.
Çok kaba bir beğeni sayısı tahmini yaparsak.
çok beğenilenlerin ortalama beğeni sayısı -> m_mean
az beğenilenlerin ortalma beğeni sayısı -> l_mean
resmin :
çok beğenilme ihtimali : m_prob
az beğenilme ihtimali : l_prob
beğeni tahmini = ( m_prob*m_mean ) + ( l_prob*l_mean )
Mesela :
gönderisi için sistemimiz 10 bin 127 beğeni alır demiş.
Tahmindeki sapmayı ise başta bahsettiğimiz olumsuzluklara, ilaveten de tahmin yöntemimizin çok kabalığına bağlıyorum. Siz nedersiniz bilmem ama bence yinde sonuç fena değil...
Daha çok gönderisi olan, takipçi durumu belli bir düzene girmiş hesaplar için daha başarılı çalışmalar yapılabilir.
Aslında görüntüler üzerinde kümelemelerde yapılıp onun üzeerinden de çıkarımlar yapılabilir. Şimdilik burda bitiriyoruz.
Her türlü görüş ve önerilerinizi bekleriz...
Kaydol:
Kayıtlar (Atom)

















































