Sayfalar

Pazartesi, Nisan 02, 2018

Kelime Kök Ayırıcı



Artık Yapay Sinir Ağları Doğal Dil İşleme  ( NLP )  alanında da kendini gösteriyor. Yoğun olarak derin öğrenme algoritmalarının kullanıldığı yeni çözümler boy gösteriyor.
Yabancı kaynaklarda  Doğal Dil İşleme ile ilgilendiğinizde elinizdeki metin verisinin  temel temizleme yaklaşımı şu şekildedir.
  1. Kelimleri  ayır
  2. Kelimelrin kökünü bul  - stem -
  3. Anlama etki etmeyen genel kelimeleri at  - stop words -
Bu şekilde bir temizleme ile yapılmak istenen şey  Anlamı bozmadan Kelime sayısını azaltmaktır.  Böyle temizleme faliyetine girişmeksizin yapılan bir modellemede kelime sayısının astronomik boyutlara fırlamasına ve modelin çok kompleksleşip, öğrenememesine sebep olabiliyor.

İngilizce gibi bir dilde kök bulmanın genellikle pek bir ters etkisi olmuyor  Fakat,  Türkçede yapısı gereği sondan eklerle bazen fazlasıyla anlam değişikliği oluyor. Bu yüzden yapılacak çalışmada buna dikkat etmek gerekiyor.

bir örnek verelim

gözüm ağrıyordu. göz doktoruna gitttim.  gözlük numaram değişmiş. 
gözlüğümün çerçeveside eskimişti.  gözlükçüye gidince,  yeni bir gözlük çerçevesi de aldım.

göz, gözüm ,gözlük,, gözlüğümün gözlükçüye, gözlük ... diye geçen kelimelrin hepsinin köküne göz demek anlamı bozar.
gözüm => göz
gözlüğümün => gözlük
gözlükçüye => gözlükçü
daha doğru bir yaklaşım gibi. Elbette bir anlam kaybı var ama nispeten daha doğru gibi geliyor bana. Elbette farklı anlamlı , yazılışlı aynı kelimeler için  bir çözüm değil bu.
 
Ortada çözümü olmayan genel bir optimizasyon problemi var. Eğer sadece kökü kullansanız, bazı anlamları kaybetme ,htimaliniz var. Tamamını kullandığınızda kelime sayınız astronomik sayılar çıkıyor.

Kelime vektörleri bu işi çözmezmi  ? ,  Kelime vectörleri dediğimiz sistemde Kelimeler sabit uzunlukta vektörler olarak ifade ediliyor.  Temelindeki  fikir şudur. Aynı anlamı ifade eden kelimeler aynı bağlamda - context - de kullanılır. Büyük derlemde - corpus  - kelimeler birlikte kullanıldıkları kelimelere göre optimize edilerek her birisi için sabit bir vektöre ulaşılıyor. Yakın anlamlı kelimeler kelime vektör uzayında bir birine yakın konumlarda oluyorlar.  Burda şöyle bir problem var her kelimenin her türlü ekiyle birlikte yeterli miktarda kullanım metnin olması pek mümkün değil.

Çok sıkıcı bir girizgah oldu kusuruma bakmayınız.  Ama sebebi var.
Bizim bir çalışmamız oldu. Kök bulma işlemini seq2seq bir modele öğretmeye çalıştık. Sağolsun Ahmet Aksoy beyin yayınladığı bir veriyi kullanarak eğittik. Bu haliyle bırakmadık Yavuz Kömeçoğlu kardeş bu model için etkileşimli bir web sayfası hazırladı.

nlp-kokbulma.herokuapp.com/

Şimdiki haliyle kullanıcının vereceği kelime için model çalıştırıp bir cevap dönüyor. Kullanıcı Cevabın doğru yada yanlış olup olmadığını ve  doğrusunu bildirebiliyor.

* Bu projenin özelliği ne peki. Yukardaki girizgahdan anlayabileceğiniz gibi çok zor bir  problemi çözdük  gibi bir iddiamız yok. Bu projenin ana özelliği klasik yaklaşımın dışında bir çözüm getirmesi
Klasik yaklaşımda şöyle olursa nasıl yaparım böyle olursa nasıl yaparım diye kurlallar silsilesi kurgulamanız lazım.  Hatta karşımıza kurguladığımız hiç bir kurala uymayan bir kelime çıkarsa.
 if kelime BU ise kök ŞU dur.  
demek zorunda kalıyorsunuz.

Modern yaklaşımlarda Olabildiğince çok veri bularak , Bir birini takip eden bir yapının diziliminden örüntüler çıkarıp istenen sonuca ulaşılmaya çalışılır. Biz bu projede bunu yapmaya çalıştık. Verimizi sağlıklı bir şekilde büyütebilirsek, modelin  başarısı artacağını umuyoruz.

* Bir başka büyük özelliği etkileşimli bir şekilde sunuluyor olması.  Günümüzde Türkçede Doğal Dil İşleme üzerine çalışma yapacak kişin, ilk toslayacağı duvar, elde hazırda verinin olmayışıdır. Sağ olsunlar Yıldız Üniversitesinden Kemik gurubunun yıllar önce yaptıkları dışında açık şekilde ulaşılabilir bir veri malesef yok. Bu çalışmayla gönüllülerin girdiği yeni kelimeler ve düzeltmelerle çok daha geniş bir verisetine ulaşabilme imkanını sunuyor.

Bu proje bir rol model olarak düşünülüp çok daha kompleks DDİ ( NLP ) problemleri için çözüm ve veriseti toplama sistemleri düşünülebilir.

Elbette bunu özel sektörde çalışan ben ve Master tezini vermeye uğraşan Yavuz tek başımıza yapamayız. Kullananlar olması lazım. Kullanıcaların yazdıklarının toparlanıp ayıklanması lazım. Sistemin yeniden eğitilmesi lazım. Epey bir emek gerekiyor.  Hatta bence bu bu tip bir proje ve elbette daha gelişmişleri, Akademik olarak sahiplenilmesi gereken projelerden.  Biz projeyi çalıştırdık. Kodumuzuda deeplearningturkiye  gurubunun github hesabında  yayınladık

github.com/deeplearningturkiye/kelime_kok_ayirici

Bundan sonra Proje sahiplerini bekliyor.

Derin Öğrenme Kısmı:


Gelelim işin teknik kısmına Modelimiz Seq2Seq denen yapıda bir ağ.  Keras kullanıldı. Kelimeler harf bazlı kodlandı. Harf çeşit sayımız 34. Yani bir harfi 34 uzunluğunda vektör olarak kodluyoruz. Maksimum kelime uzunluğu eldeki veri setine göre 22 olarak belirlendi.
RNN ağ katmanı veriyi zaman bazında istiyor. Bizim durumumuzda kelime uzunluğu 22 olduğundan
22 seferde  34 uzunluklu vektörler. Ağın çıkışıda  aynı şekilde kodlanmış olarak sadece Kök kımı üretiliyor.

Ağın genel yapısına bakalım


çok sade bir çoklu girişden çoklu çıkış -seq2seq-  üreten RNN li bir model . Fazladan diyebileceğimiz  sadece başta Dikkat - Attention - kısmı var. Giriş deki verilerin önem derecesini öğrenmesi için bir YSA katmanı yerleştiriyoruz ve katmanın çıkışını veri için bir önek katsayısı olarak kullanıyoruz.

Modeli sade tuttuk çünkü eğitim eğrisi gayet güzel test verisi başarısıda epey yüksek.



Elbette Verilerin çoğalması ile Modelede ilaveler gerekebilir. Kodda kerasın çeşitli callback fonksiyonları kullanıldı. Onlardanda bahsedelim.

  • EarlyStopping : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa eğitim veridiğiniz adım sayısından önce durduruluyor. Bizim kodumuzda 9 adım boyunca test verisi başarımında bir iyileşme olmuyorsa duryor.
  • ReduceLROnPlateau : Eğitim esnasında takip ettiğiniz  değerde belirleyeceğiniz adım -epoch - boyunca iyileşme yoksa Öğrenme hızını sizin belirleyeceğiniz bir katsayıyla çarparak küçültüyor. Bizim kodumuzda 2 adım boyunca test verisi başarımında bir iyileşme olmuyorsa Öğrenme hızı 0.5 çarpılarak yarıya indiriliyor.
  • ModelCheckpoint : Eğitim esnasında her adım sonunda belirleyeceğiniz şartlara göre modelin komple yada sadece ağırlıklarının kaydedilmesi işini yapar. Bizim kodumuzda test verisi başarım değerinde bir yükselme olmuşsa kaydediyor.
  • CSVLogger : Eğitim esnasında her adım sonunda , hem eğitim hem test verisi için , Hata değeri - loss - başarım değeri - acc - . Ve  öğrenme hızı - learning rate -  değerlerini kaydeder.

Bizim anlatacaklarımız bu kadar. Bayda uzamız buraya kadar sabırla okuğunuz için teşekkürler . Her türlü görüş ve önerilerinizi bekleriz.

Perşembe, Mart 15, 2018

Sesim nasıl görünüyor ?


Fırsat buldukça Kaggle daki yarışmalara bakıyoruz. Pek çok alanda verilerle uğraşabilme imkanı veriyor. Geçenlerde Kaggle da Ses tanıma üzerine bir yarışma açıldı.
TensorFlow Speech Recognition Challenge
Binlerce farklı kişi tarafından seslendirilmiş  30 kelimelik 1 saniye uzunluğunda bir veriseti.  65.000 kayıt var. Seçilmiş on kelime
yes, no, up, down, left, right, on, off, stop, go
ve bu kelimelerin dışındaki kelimelere - unknown - bilinmiyor. Veya sessizlik yada konuşma dışı seslere - silence - sessizlik  ilavesi ile  12 sınıflı bir sınıflandırma problemi olarak verilmişti.

Klasik spektrogram dönüşümleri ve arkasına evrişimli sinir ağları ile sınıflandırma işlemleri yapılıyordu bizde öyle yaptık ilk etapta. Yarışma sonunda 0.82579 lik  bir  başarıya ancak ulaşa bildik yarışmanın birincisinin başarısı 0.91060. pekde parlak bir sonuç değil  1315 katılımcının içinde 441. olabilmişiz. Neyse asıl konumuz bu değil.

Hazır elimizde veri varken ses verisini poincare plot  metoduyla bir görüntüye dönüştürsek ve üzerinde (CNN ) Evrişimli Sinir Ağı denesek diye bir çalışma yaptık.  Hatırlarsanız bu konuda benim büyük bir umudum var. Bir çalışmaya başlamıştım ama devam edememişdim.
Poincare Plot Feature Extraction
Ses için öznitelik çıkarma yerine doğrudan ölçeklendirip renkli bir görüntüye çevirmeyi denedik.

Yukarda 'two'  ve 'stop' kelimeleri için üretilmiş resimlerden örnekler görüyorsunuz.
Sonuçlar hiçde iyi çıkmadı malesef. Üzerinde çalışmak gerekiyor elbette. Ama estetik ve fraktalvari grafiklerde çıkmıştı. Kaybolup gitmesindedik ve koda döküp yayınladık.
github.com/birolkuyumcu/sound2image
 sound2img.py ;  ses dosyasını okuyor ve rastgele belli büyüklükteki - kodda 4096 -  parçalarını seçip görüntüye dönüştürüyor ve png formatında kaydediyor. Mesela en üstte gördüğünüz resim  "sesim nasıl görünüyor" sesinin tamamının  resme dönüştürülmüş hali.

play_sound_with_imgs ;  ses dosyasını okuyor. Bir taraftan ses çalınırken diğer taraftan  çalınan kısmıda görüntüye dönüştürüp ekranda gösteriliyor.



mesala yukardakiler Çetin Akdenizin bağlamayla çaldığı Şeyh Şamil ezgisinden.


Birilerinin işine yaraması umuduyla. Her türlü görüş ve önerilerinizi bekleriz.

Perşembe, Mart 08, 2018

Bir Yapay Zeka etkinliği



Dün Yapay Zeka ve Makine Öğrenmesi Meetup gurubunun etkinliğine katıldık. Öncelikle emeği geçenleri tebrik etmek lazım.  Böyle önemli konularda insanları bir araya getirmek çok önemli. Hele birde bu vesileyle birlikte bir şeyler yapmaya başlarsa...

Etkinlik TOBB üniversitesindeydi. Yerin bizim nezdimizde ayrı bir yeri var. Yıllar önce 2010 yılında ben ve Ahmet Kakıcı TOBB üniversitesinde bir sınıfda Yapay Sinir Ağları konusunda sunum yapmıştık.
Yazılım Atölyesi 2 ( Handwritten Digit Recognation ) 

TTGV den gelenlerin ufak bir konuşması oldu. Ideaport tan bahsettiler. Yapay Zeka işleri için çok önemli olan ekosistemin oluşması konusunda uğraş vereceklerinden bahsettiler. Belkide konuşmanın kısalığından, neler yapabileceklerinden çokda anlatmadılar.
İletişime geçilmesi istendi
etkilesim.ideaport.org.tr/
Bence duyrularının yayılabilmesi için uğraşmaları lazım. Yaptıkları çok güzel çalışmalar etkinlikler oluyor ama bizzat ağlarında değilseniz haberiniz olmuyor.
mesela bu vesile olmasa


TTGV kıvılcımdaki bu etkinlikten haberim olmayacaktı...

Programdaki asıl konuşmayı Prof. H. Altay Güvenir hoca yaptı. "Tıp Alanında Makine Öğrenmesi Uygulamalarından Örnekler " başlıklı konuşmasında  çeşitli Tıbbi problemler için yaptıkları çalışmalardan bahsettiler. Başlıklar şöyleydi ;
  • Kalp işaretlerinden ritim bozukluğu tanısı koymanın öğrenilmesi. 
  • Dermotolojide Erythemato-Squamous hastalığının türünün belirlenmesi. 
  • Mide kanserlerinin (gastric carcinoma) derecesinin belirlenmesi. 
  • Sıralama öğrenme. Tüp bebek tedavisinde başarı şansının tahmin edilmesi ve uygun tedavinin önerilmesi. 
  • Kalpte Artial Fibrilasyon riskini etkileyen faktörlerin belirlenmesi. 
  • Hasta kayıtlarının güvenliğini koruyarak makine öğrenmesi uygulamaları.

Akılda kalan  şey  1997 de geliştirilmiş bir metod var.  Voting Fetures Interval

differential diagnosis of erythemato-squamous diseases using voting feature

hatta wekaya da eklenmiş metod olarak.  Ama devamı gelmemiş malesef. 

Yukarda bahsettiğimiz eko sistemin  önemi büyük, yapılan çalışmaların serpilip büyüye bilmesi için pek çok faktör var.  Bizzat yaşayarak da görmüşlüğümüz var.  Yapay Zeka Tıbbın hizmetinde diye bir dizi yazı yazmıştım  ( 1, 2,3,4,5 )  ilkini 2008 de yazmışım. Malesef öyle yada böyle filizlenen nadir çalışmalarda diğer faktörlerin - finans, otorite, pazarlama vs... -  yokluğundan  heba olup gidiyor.

Ideaportta ;
2018 yılı için tematik teknoloji alanı olarak yapay zekayı ve belirlenen bu teknolojik alanın kesişimlerinin inceleneceği uygulama sahası olarak da sağlık sanayini belirledik.
denmiş.  İnşallah bir şeylerin değişmesine vesile olur...

Pazartesi, Ocak 22, 2018

Bir derin öğrenme deneyi ( dropout ve batch normalization )

Derin öğrenme artık hemen her alanda kullanılmaya başladı. Popüler oldular çünkü yapay öğrenme algoritmalarından en güçlüsü olduklarını kanıtladılar. Buraya şöyle bir not düşeyim güçlü olması her zaman en doğru çözüm olmasını gerektirmiyor. Neyse konumuza dönelim.  Gerçek bir uygulamaya başlayan insanların hemen farkına varacağı tuhaf bir durumu var. Ağ yapısının bir standardı yok. Çeşitli uygulamalar için başarılı olmuş modeller var elbette.  Lakin "benim şöyle bir problemim var buna en UYGUN ağ yapısı nedir ?"  sorusunun  bir cevabı yok.
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 ..
gibi pek çok konuda belirsizlikler var. Bu gibi belirsizlikler alanı  tecrübi yani deneysel hale getiriyor.
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.

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.
Deneyimiz için cifar 100 veri setini seçiyoruz. 
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 Normalizasyon  olmaksızın sonuçlar


Ara Normalizasyonlu sonuçlar


başlıkların anlamlarını verelim
  • '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
 Başarı değerinin büyük hata değerin küçük olması daha iyi. Problemimin sınıflandırma olduğundan başarı değeri daha önemlidir. Başarı değerininde Test için olan değeri daha anlamlıdır. Ağ yapıları çok güçlü olduklarından veri setiniz büyük bile olsa ezbere kayabilmekdedirler. Tablolarda en iyi değerleri kırmızı olarak yazdırdık.

İ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
Bizden bu kadar.  Akadamik camiadan  daha geniş deneysel çalışmalarıda bekliyoruz...

Perşembe, Ocak 18, 2018

OpenZeka MARC Mini Otonom Araç Yarışması





Duyanlarınız vardır muhakkak ,MIT de önderliğinde ABD de  Mini otonom araç yarışması düzenlenenmektedir. 
Bu yarışmanın Türkiye versiyonu ilk defa düzenleniyor.  Türkiyede bu  sorumluluğun altına OpenZeka firması girdi. OpenZeka, Türkiyede derin öğrenme farkındalığının öncülerinden olan Ferhat Kurt beyin bir girişimidir.

OpenZeka Marc
En son teknoloji ürünü sensör ve yapay zeka algoritmalarını kullanmak ve uygulama geliştirmek,
Takım çalışması ve takımlara arası etkileşim kültürünü artırmak,
Kendine güvenen ve robotik alanında ülkemizi temsil edecek genç girişimcileri yetiştirmektir.

Bu yarışmaya katılan takımlara yarışmada kullanılacak mini otonom aracın tasarımı ve yapay zeka algoritmalarının kullanımı konusunda ücretsiz eğitim verilecektir.

Open Zeka, bu yarışmayla yakın gelecekte hayatın her alanında yer bulacak otonom sistemleri tasarlama ve algoritma geliştirme seviyesini lise düzeyine indirerek ülkemizde teknoloji firmalarının ihtiyaç duyacağı otonom sistemleri geliştirebilen insan kaynağını oluşmasına katkı sağlamayı hedeflemektedir.
diye  anlatılmış etkinliğin web sayfasında. Bizcede Bu yarışma,Yapay Zeka ve uygulamaları konusunda bir sosyal sorumluluk projesidir.


Etkinlik kapsamında verilecek eğitimler için elimizden geldiğince yardımcı olmaya çalıştık.

Etkinlik kapsamında
  • ROS, 
  • kontrol teorisi
  • lidardan veri okuma
  • lidar verisiyle duvarı takip
  • Kameradan veri okuma 
  • Renk Filtreleme 
  • Duba takibi ( Renk  Filtreleme )
  • Parkur ve joyistik kaydı
  • Kayıtı kulanarak Derin Öğreneme Modeli Eğitimi
  • Eğitilmiş Model ile aracın otonom olarak parkurda hareket etmesi
Anlatıldı. Bizde  OpenCv anlattık ve Derin Öğrenme modeli için veri seti toplama, eğitme ve eğitilmiş modelin kullanımı konusunda yardımcı olduk. Pek çok ilgili bilgili insanlarla tanışıp, konuşmakda ayrıca mutlu etti bizi.

Yarışmalar önümüzdeki ay başlayacağını burdan duyurmuş olalım.

Yarışmanın ülkemiz açısından önemi büyük,  pek çok kesimde bilgi birikimi ve tecrübe kazanma vesilesi olacak bir etkinlik.   Bu yüzden uzun ömrülü bir etkinlik olmasını arzu ediyoruz.  Yapay Zeka konusunda  ilgili herkesinde destek olmasını canı gönülden istiyoruz.

Salı, Ocak 16, 2018

2017 de neler yaptık

2018 in ilk yazısı olarak geçen sene neler yaptığımıza dair bir yazıyla başlamak istiyorum.  Öncelikle blogdan başlayalım.

Blog da yine uygulamalı ve pratik örnekler vermeye çalıştım. Yazılarımızın pek çoğu Derin öğrenme ile ilgiliydi.  Derin Öğrenme ile ilgili pek çok kütüphane ortaya çıkdı. Avantajlar , dezavatajları neler, Hangisini tercih etmek lazım ? gibi sorulara cevap niteliğinde  yazılar yazdık


Özetle Elbette Caffede kullanıyoruz ama tercihimizi Keras dan yana yaptık.  Bu yüzden  Caffenin yanı sıra bu yıl Kerası da kullanmaya ve öğrendiklerimi anlatmaya başladım
 ilki temel açıklamalar hakkında bir giriş yazısı ikincide LSTM anlatılıyor ve zaman serisi ile bir uygulama yazıyoruz.

 
Semantik bölütleme bilgisayarlı görü ile ilgili autoencoder denen bir Ağ tipiyle Uydu görüntüsünden bina bulma işlemi yapdık. 



Duygu analizi diye geçen yazıdan Doğal dil işlemenin bir uygulamasını yapıyoruz.

Caffe ilede ilgili iki yazımız var
 İlkinde FCN ağ yapısında hazır bir caffe modelinin kullanımıyla semantik bölütleme yapılıyor.
Ağ yapısından bahsediliyor.

İkicisi aslında Caffe modellerini görselleştirip hangi katmanda neler oluyor görebilmemizi sağlayan bir uygulama.





 Açık kaynak kodlu bir proje olarak paylaşıyoruz.


 Elbette OpenCv hakkında da yazılar yazdık
 Yazılar  OpenCv nin pythondan kullanımı ve Derin Öğrenme modellerinin opencv içinden çağrılmasıyla ilgili.


Bu rda bahsettiklerimiz dışında da yazılarımız var. Bu senede klasik olan şey malesef  yine ilgi çok tepki yok  durumunun devam ediyor olması. Ben yinede hatırlatmış olayım her türlü görüş önerilerinizi bekleriz.

Cumartesi, Aralık 09, 2017

Eski Kodlar...

Blogdaki eski yazılarımız halen okunuyor ve paylaştığımız kod ve dökümanlara ulaşılmaya çalışılıyor.  Zaman zaman ulaşılamadığına dair yorumlar ve iletilerde geliyor.

Neler varmış mesela











FAQ kısmımızda bahsettik burda yine tekrarlıyalım. Eski kodlarımızı genelikle "Google-Code"  projesi olarak yayınlıyorduk. Google bu hizmetini kaldırdı hali hazırda sadece eski projeleri indirmek için kullanabiliyorsunuz. 
code.google.com/archive/p/derin-deli-mavi/
Ama buda bir süre sonra tümden kaldırılacak.
Bizde halen kullanılabilecek fadalana bileceğinizi düşündüğümüz kodları githubda bir proje açıp içine aktardık
github.com/birolkuyumcu/ddm_projects_old
Bu github kod deposudan ulaşabilirsiniz...

Çarşamba, Aralık 06, 2017

OpenCv ve Derin Öğrenme

OpenCv nin yeni versiyonundan bahsetmiştik.
Windowsda Python için OpenCv kurulumu
En büyük yenilik  Derin öğrenme modellerini  opencv içinden çalıştırmanıza imkan  sağlayan DNN  modülünün, ana dağıtıma eklenmesi olmuştur.  Halen yoğun bir şekilde geliştirilen bir modül. Derin öğrenmenin üst düzey popülerliğinde  opencv camiasıda buna kayıtsız kalamazdı. Bizde bu yazımızda bu modülü kullanan bir örneği anlatıp paylaşacağız.

Öncelikle DNN den bahsedelim. OpenCv nin DNN modülü genel bir ihtiyaç aslında. DNN ağlarını eğitmek için pek çok kütüphane meydan çıkdı. Her birsinin değişik iyi ve kötü yanları var. Bizde iki yazıyla bu konudan bahsettik
Derin Öğrenmede Kütüphane Savaşları 1 , 2
Bir başka ve daha yaygın ihtiyaç daha var. Eğitilmiş modellerin kullanılması. Elbette kendi kütüphaneleri içinden kullanmanız mümkün. Ama hem caffe, hem torch , hem tensorflow  kütüphanesini kullanmak istersek ne olacak ? her birisiyle ayrı ayrı uğraşmak yerine bir kütüphane olsa eğitilmiş modelleri sadece çalıştırmak için kullanabilsek.  İşte OpenCv de DNN tamda bu iş için geliştiriliyor. Şimdilik en büyük eksikliği sadece cpu üzerinden çalıştırılıyor olması. Halen vadettiklerini hepsini gerçekleştiremiyor ama yoğun olarak geliştiriliyor.

Gelelim DNN örneğimize. Biz bu yazımızda bir nesne tespit ağı olan SSD nin hafif versiyonu Mobil SSD ağını çalıştıracağız.
SSD bahsedelim ,  Single Shot MultiBox Detector   kelimelerinden oluşturulmuş bir kıslatma.
2015 yılında,  Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg  kişiler tarafından yayınlanan
SSD: Single Shot MultiBox Detector
makalesiyle ortaya çıktı. Ağ yapısı

başlangıcı VGG sonunda ise nesne sınıfı ve konumunu gösteren çerçeve veriyor.



Ana SSD github sayfası
github.com/weiliu89/caffe/tree/ssd
Bizim bu gün kullanacağımız Mobile SSD github sayfası
 github.com/chuanqi305/MobileNet-SSD
 Gelelim koda ;

Kodu kullanabilmeniz için OpenCV  3.3 ve üstü lazım.

OpenCV de caffe modeli kullanabilmek için  2 dosya lazım
  • Ağ yapısını tutan prototxt dosyası
  • Eğitilmiş Ağ ağırlıklarını içeren caffemodel uzantılı dosya

cv2.dnn.readNetFromCaffe fonksiyonuyla bu ikisini kullanarak ağı  oluşturyoruz.



Ağı çalıştırmak için kullacağımız görüntüyü öncelikle ağın giriş ebatına (300x300) çeviriyoruz. Sonrasında görüntüyü cv2.dnn.blobFromImage fonksiyonuyla blob a çeviriyoruz.  Oluşturduğumuz ağ nesnesine bu blobu verip ağı çalıştırıyoruz.


Çalışan ağ bize tespit ettiği nesneleri ve konumlarını ve tespitin eminlik değerini verir. Bundan sonrasında resim üzerinde çerçeve ver sınıf bilgilerini yazdırıyoruz.



Koda OpenCv kitabının kodlarının python versiyonlarını yazdığımız 
github.com/birolkuyumcu/opencvbook_python
ders 13 olarak ulaşabilirsiniz
her türlü görüş ve önerilerinizi bekleriz





Perşembe, Ekim 26, 2017

Levent Ali Keten 'nin hatırasına....

Levent ile tanışıklığımız 2009 yılına dayanıyor. Her şey aşağıdaki ilk e-posta ile başladı



Merhabalar, 

...

Sizin de bir yazınızda belirttiğiniz gibi yazılım, içimde hep ukte kalan birşeydi. 1990 yılında üniversiteyi kazanınca yazılımı bıraktım. Üç yıl öncesine kadar da yeniden elime almadım. Yazılıma Commodore 64 le, basicle başladım. Sonraları cobol, ne yazdığımı hatırlayamayacak kadar C. Orta okul dönemim elektronik sevdasıyla geçti. Evde bozmadığım birşey kaldı mı hatırlamıyorum. Ama bir sürü de şey yapmıştım. Sanat okulunu 2.likle kazandığım halde 1. ye bölüm değiştirme hakkı tanıdılar bense tercih sebebiyle Tesviye bölümünde okudum. Sonra onu çok sevdim. Makinalar, çalışmaları hep merakımdı çünkü. Çok iyi bir tesviye eğitimi aldım. Ancak üniversitede matematik eksikliğim yüzünden Turizm Eğitimi bölümünü kazandım. Kısacası devletin bana eğitimim için yaptığı tüm yatırımlar boşa gitti. Elektronik okuyamadığım için tornacı, mühendis olamadığım için turizmci, turizmi sevmediğim için de bilgisayarcı olmuştum. Ama yazılım hep ukte kalmıştı içimde. 

Bu hayatta neyi istediysem Allah'tan hepsinin sahibi oldum. Söke söke aldım hayattan her istediğimi. Uzunca bir bilgisayar satıcılığından sonra, sektörün artık tekel büfeleriyle yarıştığı dönemde kapadım işyerimi. Ankara'ya gidip 6 ay boyunca yazılım kursu aldım. Dot.Net. İyi bir yazılımcıyım. İyi bir algoritma mantığım var. Eğitimden sonra birkaç yazılım yapıp sattım. Fizik tedavi merkezlerine. Ancak sağlık bakanlığı 1 yıl içinde öyle kararnameler çıkardı ki, yazdığım tüm yazılımı iki kez yazmak zorunda kaldım. Sonra kararnamelere yetişemeyince, sağlık alanını bıraktım. Çünkü ekip kurmaya ne maddi gücüm yetiyordu, ne de bu ülkede ortak iş mantığı gelişmişti. Sonra iki yıl Eskişehir'de kaldım. Birkaç firmaya birkaç yazılımdan sonra doğduğum yere, Mersin'e geri döndüm. Burada da aklımdaki projeleri hayata geçirebilmek için, hayatımı idame ettirebilecek bir ek gelir adına web tasarımları yaptım. En son 5 ay önce  Mersin Büyükşehir Otogar'ına otomasyon sistemi yazma işini almam, sizinle tanışmaya kadar getirdi işleri.

Muhasebe otomasyonunu yazdıktan sonra, benden kapı girişlerinde plaka tanıma sistemi olmasını istediler. Herkesin belirli alanlarda uzmanlaşmasını her zaman benimsemişimdir. Bu yüzden bu komponenti yazan bir firmadan alıp kullanmak istedim. İşte herşey ondan sonra başladı. Bu komponenti yazan firmalar, ya komple sistemi satıyorlardı, ya da 5 bin euro istiyorlardı. Ne yalan söyleyim, bu güne kadar 5.000 euroluk bir yazılım işim olmadı. Hele ki Anadolu'da bu fiyat!

En son görüştüğüm bir İstanbul Teknopark firmasına, yaptıklarının yanlış olduğunu, bu komponentin binlerce kullanım alanı olduğunu, bu fiyata sattıkları sürece bu alanlarda bunların kullanılamayacağını, bunun aynı zamanda binlerce istihdamı önlediğine varana kadar konuşmalarım boşunaydı ve en son dalga geçer gibi, bu komponenti 4 yılda bilmem kaç mühendisle, profla yazdıklarını, bunun öyle benim yazdığım yazılıma benzemeyeceğini küçümser bir tavırla söylediklerinde, bende "e bizde oturur kendimiz yazarız" dedim ve hiç alanım olmayan görüntü işlemeye dalmış oldum böylece.

3 aydır kısıtlı kaynaklarla geldiğim aşama plaka karakterlerini temizlenmiş olarak çıkartmak oldu. Bu aşama içerisinde oldukça başarılı sonuçlar elde edebildim. Ancak bu aşamadan sonra OCR işleminde YSA kullanıldığını öğrendim. Elimdeki kaynak miktarı sanırsam bir 200 Mb civarında. Onlarca tez, döküman, internet sayfası vs. Ama  üzülerek söyleyim ki bir çoğu kopyala yapıştır arasına birşeyler sıkıştır yazılmış. 

YSA'yı anlayamadığım için onunla ilgili her hangi bir algoritma ve  kodda türetemiyordum. Taaki sizin sitenizle karşılaşana kadar. Aslında algoritma olarak sizin sitenizden çok yararlandığım söylenemez. Ama YSA'nın ne olduğunu sizin siteniz sayesine öğrendim. Sitenizde ilgimi çeken bu alanla ilgili okumadığım bölümünüz yok. Elleriniz dert görmesin. Ancak ben 38 yaşından sonra yeniden yazılıma döndüm. Teknik olarak okuduğumu eksikleri tamamlama yöntemiyle anladığım bir ingilizcem ve kod olarakda VB.Net. 
Yazdıklarından da anlacağınız üzere, Kendisi benim yaşlarda çekirdekten yetişme, şevkli bir yazılımcıydı.  Hoş sohbetti. Bizimde ysa konusundaki yardımımızla,  o yıllarda bir plaka okuma yazılımı geliştirmeyi başardı. Vefakardı işi bitince bizi unutmadı, sonrasında da irtibatımız devam etti. Gerek online gerekse ankaraya gelikçe yüz yüze görüşmelerle muhabbetimiz devam etti. Çok girişken bir kişiliği vardı. Ben yıllarca dökmeye devam ederken o maceradan maceraya atıldı. Çok değişik alanlarda değişik yazılımlarla uğraşdı. Mesela Damda topraksız tarım işine girişti. Kendi elleriyle imal etti



otomasyonu için devreler kurdu programlar yazdı.

Firmasını  Mersin teknoparka'a taşıdı orada çalışmaya devam ediyordu.
 Keten Yazılım
En son temmuz ayında yazışmamızda
"akciğerde bir kitle tespit ettilerne olduğuna karar veremediler yarın bir docent muayne edecek"
diyerek sağlık problemlerinden bahsetmişti.  Bir kaç kez telefonla ulaşmaya çalıştıysamda, sonrasında görüşmemiz malesef mümkün olmadı.  Şimdide Geçen hafta cuma günü vefat ettiği haberi geldi.
Ben bir dostumu, ülkmizde çilekeş bir yazılımcısını kaybetti çok üzgünüz. Kendisine Allahdan Rahmet. Başta kızı olmak üzere yakınlarına başsağlığı ve sabır diliyoruz...

Salı, Ekim 10, 2017

Keras ile Duygu Analizi

Bir başka Keras uygulaması ile yine burdayız. Bu uygulamamız, doğal dil işleme ( NLP ) alanında olacak. Metinden duygu analizi  (Sentiment Analysis) üzerine bir çalışma yaptık.

Doğal dil işleme üzerine bir uygulama geliştirmenin ana zorluğu metinin sayılara dönüştürülmesi. Genel olarak kullanılan metodlar.
  • Kelimeler için vektör karşılığı ( WordVect)  hesaplamak ve bu vektörleri bir dizi şekilde vermek.
  • Kelimeleri bir dizi de tutup orda belli büyüklükte vektörlere eğitim esnasında çeviren Embeding katmanını kullanmak 
  • Metinin harf dizisi olarak düşünüp.  Her harfi harf sayısı kadar uzunlukta bir vectörle ifade etmek.
 Metinden duygu analizi çalışmalarında  genellikle verilen metnin olumlu yada olumsuz olduğunun tespiti üzerine çalışılır. Bizim kullandığımız veri seti de Twitlerin olumlu yada olumsuz olması hakkında.

Veri setimiz hakkındaki bilgilere ve verisetinin kendisine burdan ulaşabilirsiniz

thinknook.com/twitter-sentiment-analysis-training-corpus-dataset-2012-09-22/

Veri setimizde toplamda 1578624 adet kayıt var.
Olumlu   :    790184
Olumsuz :    788440
olumlu ve olumsuz nitelikli metinlerin sayılarıda aşğı yukarı eşit.

Biz metinin sayıya çevrilmesi için harf bazlı bir sistem uyguladık. Veri üzerinde herhangi bir filitreleme yapılmadı. Sadece küçük harfe çevrildi. Metinlerde geçen harler çıkarılıp birer sıra no karşılığla bir sözlükte -dict - tutuldu.
{'\t': 0,
 '\n': 1,
 ' ': 2,
 '!': 3,
 '"': 4,
 '#': 5,
 '$': 6,
 '%': 7,
 '&': 8,
 "'": 9,
 '(': 10,
 ')': 11,
 '*': 12,
 '+': 13,
 ',': 14,
 '-': 15,
 '.': 16,
 '/': 17,
 '0': 18,

...
Veri sadece Ağ yapısı olarak LSTM bazlı basit bir sistem kuruldu. LSTM de dizinin tersine sıralamasınıda hesaba katan Bidirectional katmanı ile birlikte kullanıyoruz.

 Layer (type)                 Output Shape              Param # 
===================================
bidirectional_1 (Bidirection (None, 150, 278)          310248  
_________________________________________________
bidirectional_2 (Bidirection (None, 278)               464816  
________________________________________________
dense_1 (Dense)              (None, 2)                 558     
________________________________________________
activation_1 (Activation)    (None, 2)                 0       
====================================

Total params: 775,622
Trainable params: 775,622
Non-trainable params: 0

Veri epey büyük olduğunda eğitim epey uzun sürüyor biz bir kontrol başarısı %85 civarında kesdik.
Çalışmamıza burdan erişebilirsiniz
github.com/birolkuyumcu/ddm_blog_examples/tree/master/sentiment
 Üzerinde çalışılması lazım elbette ama bence bu halide fena değil. Bir örnek verelim
"Got the Macbook Pro seller to send me the serial number of the machine before I paid.
Turns out its just a macbook so not buying it now"
 bu twit için  modelimiz.  0.623167 oranıyla olumsuz diye karar vermiş
aynı twitin başındaki kısmı alıp sorduğumuzda
"Got the Macbook Pro seller to send me the serial number of the machine "

haklı olarak  0.62573 oranıyla olumlu cevap vermiş.

Giriş niteliğinde, harf bazlı, LSTM içerikli bir çözüm. Bir başlangıç noktası olmasını umuyor, görüş ve önerilerinizi bekliyoruz...


Pazar, Ekim 01, 2017

Pooling Terimi hakkında...

Terimlerin dili bizim gibi üreten değilde takip eden topluluklar için  bir mesle olmuştur.  Bilimi , teknolojiyi geliştirenler , terimleride belirlemektedirler. Bizde ise genelliklede terimler olduğu gibi yada küçük değişikliklerle kullanıma giriyor.

Asla böyle bir şey olmamalı anlayışında değilim. Nitekim  teknoloji gibi yabancı tabir yaygın olarak kullanılmaktadır. Sonuçta kelimeler iletişim için kullanılır. Terimin ifade ettiği şeyi bilen insanlar için  kelimenin kendisinin pek bir önemi kalmamaktadır.  Eğer bir terim yeterince yaygınlaşmışsa onun kullanılması gerektiğini düşünüyorum. İlla Türkçeleştireceğim anlayışının çoğu zaman dilde fakirleşmeye sebep olacağını. Hatta asıl fonkisyonu olan iletişimi sekteye uğratacağını düşünüyorum. Mesela ; Teknik kitapların, yaygınlaşmış terimleri bilmeyen birisi tarafından tercüme edilmesiyle anlaşılmaz bir metne dönüştüğünü muhtemelen görmüşsünüzdür.
 
Yaygınlaşmamış bir terimin,  zamanında ve doğru bir şekilde türkçe karşılığının bulunmasının çok önemli olduğunu düşünüyorum.  Terimi ilk defa duyan bir insan o yabancı tabirin ifade ettiği şeyi öğrenir. Kelime sadece o kavramın bir etiketidir.  Türkçe karşılığın önemi burdan geliyor. Düzgün bir karşılık , türkçede ifade ettikkleri sebebiyle konuyu bilmeyen birisinede kavram hakkında bir şeyler anlatır. Bir önek vereyim "bisiklet" kelimesi bisikleti bilmeyen birisi için bir şey ifade etmez. Yabancı dildeki karşılığı bicycle - iki çember -   ile kaffasında hiç bilmeyene bile bir şeyler çağrıştırır.

Yaygınlaşmamış terimlerin türkçeleştirilmesinde yapılan bir hatada da kelime bazlı tercümeye kapılmaktan geliyor. Hatta bu yanlış, bilen insanları anlamsız karşılık yada orjinali arasında bırakıyor. Belkide pekçoğu orjinalini tercih etmek zorunda kalıyor.

Yapılması gereken ne peki derseniz. Benim görüşüm şu şekildedir. Tercüme yapanlar bilir bir kelimenin birden fazla anlamı vardır. Her anlamı bir birini karşılamaz.
Doğru tercüme kavramı Türkçeye çevirmekden geçer.

Yapılan hatayı Derin öğrenme litaratüründeki  "Pooling" tabirine bulunan "Havuzlama"  karşılığı ile açıklayayım.

Gerçekte Pooling terimi neyi ifade eder.




Tercüme mantığı ne peki 
pool =  havuz 
pooling  = havuzlama
Önce çıkarımın yanlışlığına bakalım. Pool ne demek

Oxford Sözlüğünden bakıyoruz. link

iki ana anlamı olduğundan bahsediliyor ilk anlamı

1 ) pool  :  A small area of still water, typically one formed naturally.

Biz fiil olarak kullanığımızdan , fiil hali neymiş diye bakalım .

1 ) pool  Verb :  (of liquid) form a pool on the ground or another surface.

yani havuz yapmak anlamına geliyor. Pooling teriminin derin öğrenmedeki anlamını düşünürseniz. Bu anlamın bu kavramla alakasının olmadığını anlayabilirsiniz.

İkinci anlamına gelelim
2)  pool :  A shared supply of vehicles or resources to be drawn on when needed.
fiil hali
2) pool verb - with object  :   of two or more people or organizations) put (money or other assets) into a common fund.
bu anlamı bizim kavrama daha uygun gibi.

oxford sözlüğü direk pooling için ayrı bir anlam vermemiş. Cambridge sözlüğünde şöyle bir karşılık var
pooling : the act of sharing or combining two or more things

bu anlam aslında kavramın ifade ettiği şeyi hissettiriyor. Birden fazla şeylerin bir araya getirilip paylaşılması.

Gelelim  Türkçe tarafına ;

TDK sözlüğünden havuzun manasına bakalım peki
havuz
isim Arapça ḥavż
1. isim Su biriktirme, yüzme, çevreyi güzelleştirme vb. amaçlarla altı ve yanları mermer, beton benzeri şeylerden yapılarak içine su doldurulan, genellikle üstü açık yer
"Ben havuzu seyrederken o giysileriyle içine dalardı." - R. Mağden
2. Kum, asit vb. konulan çukur yer
"Kum havuzu."
3. denizcilik Büyük gemilerin onarılmak için çekildikleri yer
4. Bir amaç güdülerek farklı kaynaklardan gelen paranın ilgililere daha sonra paylaştırılmak üzere toplandığı belirli bir yer

Bu dört anlamdan olsa olsa sonuncusuyla bir nebze zoraki bir bağdaştırma yapabilirbiliriz. Ama bir başka problem daha var "Havuzlama" fiil olarak zaten TDK sözlüğünde mevcut.  Denizcilikte 3. anlamı için kullanılıyor. 
havuzlamak : Gemiyi onarmak için havuza çekmek
Zoraki bağdaştırma ancak kavramı bilen için bir anlam ifade eder. Doğrusu bulunan karşılığın Kavramı bilmeyen için kavram hakkında ip uçları verebilmesidir.

Sonuç olarak ;  havuzlamayı pooling karşılığı olarak kullanmayı doğru bulmuyorum. Ne saçma türkçe karşılıları savunmak nede olduğu gibi bırakmak doğru değil. Benim tercihim ya doğrudan pooling diyorum yada ebat küçültme yada  örneklem tabirini kullanıyorum.

Pazar, Ağustos 27, 2017

Derin Öğrenmede Kütüphane Savaşları 2


 TensorFlow

TensorFlow  kütüphanesi bir Google ürünü. Açık kaynak kodlu ticari kullanıma uygun lisanslı. Geç çıkmasına rağmen, Google'ın iteklemeleriyle - destek kelimesi az gelir diye böyle yazıyorum - epey bir öne çıktı. Derin öğrenmeyi ilk farkeden şirketlerden olması sebebiyle firmalarında bu işle uğraşan epey insan vardı. Bunların hemen hepsi - el mahkum -  tensorflow'a geçti. Theanonun üstünde çalışan popüler kütüphane Keras'ın geliştiricisini işe aldı. Keras theanodan sonra tensorflow üzerinede çalışmaya başladı. Hızını alamadı, Kerası bir alt küme halinede getirdi.
Tensorflow'u bulut da daha bir hızlı çalıştıracak donanım çıkardı tensor processing unit. Bu adımıyla hem NVIDA hemde Amazona tehdit oluşturdu.
İşin ticari yönündeki gelişmeleri öngördü. Yapılacak uygulamaların çoğunun web tabanlı servis olarak sunulacakdır. Bir strateji kurdu,  tensorflow yaygınlaştırılacak. Eğitilmiş modelleri sunan sistemler kurup ordan para kazanmak. Nitekim Algorithmia - open marketplace for algorithms -  google dan yatırım aldı
Sonuç olarak Google 'ın Vakti zamanında Microsoftun yaptığı tekelci hamlelerini andıran davranışlar sergilediğini düşünüyorum. Tensorflow hakkında teknik hiç bir söylemiyorum çünkü Yukarda bahsettiğim davranışları antipatik bulduğumdan hiç kullanmaya niyetlenmedim. Bence Tensorflow popülerliği zorakidir. Piyasadaki diğer kütüphanelerden olan üstünlüğüyle değil google'ın diretmesiyle bu haldedir. Tavsiye etmiyorum

CNTK 

Microsoftun  kütüphanesi ismi  "Microsoft Cognitive Toolkit"  olarak değiştirildi. Microsoft da derin öğrenmeye erken girişen firmalardan. CNTK 'yı denemek için niyetlenip incelediğimde tuhaf bir lisansla karşılaştım.
CNTK-1bit-SGD-License
ve vazgeçtim. Google ile aynı niyetle çalışmalarını sürdürüp ürününü popülerleştirmeye çalışıyor.
Reasons to Switch from TensorFlow to CNTK
 Programcıların gözdesi Kerasa da el  attılar tıpkı google gibi...


Using CNTK with Keras

Yine google gibi donanım işine el attılar TPU ya alternatif FPGA yi de öne sürüyorlar.
Rekabetten Kerasın güçlenmesini sevinsemde doğrudan CNTK yı tavsiye etmiyorum.

MxNet


Önceleri gariban şimdilerde Amazonun  desteklediği  bir kütüphane. 

MXNet - Deep Learning Framework of Choice at AWS

Apache da destekliyor

MxNet sponsored by the Apache Incubator
Eskiden beri windows desteği olan. Hatta  derlenmiş dağıtım sunan çok beğendiğim bir kütüphane. Derin öğrenmeye ilk başladığımda üzerinde denemeler yaptım. İlla python diye ısrarı yok   C++, R, Js,Julia hatta go ile yazabiliyorsunuz. Modaya uyup Kerasın altında çalışmaya adapte edildi.
Yanlız kerasın eski versiyonu üzerinde çalışıyor nedense. Yeni versiyon için desteğinde geleceği söyleniyor. 
MxNet ile devam etmemiş olmam yeterli dökümantasyon ve örneğin olmamasıydı. Yeni desteklerle bu eksikliklerini tamamlıyor gibiler.  Bir gözünüz MxNet te olsun derim ben...

Keras

Popüler üst düzey programcıların gözdesi  python kütüphanesi . Kullanımı çok kolay. Öğrenmesi kolay. Örnek ve destek çok.

Sonuç olarak Kerası kullanıyorum ve tavsiye ediyorum.
Elbettte eksiklilkeri var.
 Keras üst  düzey bir kütüphane, çalışabilmesi için altta başka bir kütüphanenin - backend- çalışıyor olması lazım.  Hali hazırda Theano , Tensorflow, CNTK  kütüphaneleri bu işlevi yerine getiriyor. MxNet 'in de eli kulağından  kerasın eski versiyonu için adapte edildi. yeni verisyonu için çalışmalar yapılıyormuş.  Allta çalışan kütüphanelerin sebep olduğu sıkıntılar

Eğittiğiniz modeller altta çalışan kütüphaneye göre değişiyor. Python dışında çalıştırmak için de genel resmi bir  çözüm yok malesef. (şunlar var ;  kerasify , keras2cpp )
Yeni katman tipleri yazmak gerektiğinde , genellikle kerasın imkanları yerli olmuyor. Altta çalışan kütüphaneyide biliyor ve iyi bir şekilde kullanabiliyor olmanız lazım.
Çok büyük veri setleri için modele hızlı veri besleme için dahili bir çözüm yok malesef.
Multi GPU desteği henüz yok sayılır. ( Mxnet le birlikte gelecek gibi görünüyor  bakınız )

Burda bahsedemediğimiz pek çok irili ufak kütüphanede vardır elbette. Biz hakkında az çok bilgi sahibi olduğumuz nispeten daha yaygın olanlardan bahsettik.

Şirketlerin Konumları

Kütüphanelerin savaşları dedik.  Durumu  savaşa ! çeviren şirketlerin taraf tutarak diğer seçeneklere karşı olmaları. Kütüphaneleri anlatıren bahsettik ama burda şirket şirket bir adaha yazayım. Beleşe tavsiyelerde bulanayım dedim

Google :  

Google bence yanlış yapıyor.  Tekelci bir anlayışla davranmanın kazandığın durumda şirket için iyi olması yapılan şeyin doğru olduğunu  göstermez. Tensorflow'u destekleyebilirsiniz ama diğerlerini ezmeye çalışmak doğru değildir. TPU  üretmek ve piyasaya sokmak isteyebilirsiniz ama diğer kütüphaneler ile kullanılabilecek alt yapıyı sağlamalısınız. Hiç olmadı Kerasa destek olmazız lazım.

Quaradaki "Is Google an evil company?" sorusuna şöyle bir cevap gelmiş
"The only significant difference between a kitten and a tiger is that the tiger is bigger"
Eğer kaplan büyüklüğündeyseniz hareketlerinize daha çok dikkat etmeniz gerekir. Aksi halde sorunun cevabı Yes olur.
  

Microsoft:

Google dan önce kaplan olmuş :) ve "Is Microsoft an evil company" sorusuna Büyük bir Yes cevabı almış ve bunun ceremesini yıllardır çeken bir firmadır. Google a göre daha temkinli davranmayı öğrenmiştir. Linux'a kapılarını açmış ordada iş yapmaya -Azure- başlamıştır.  Ortada bir sürü lisansı uygun kütüphane varken kendi yayınladığı ve yaygınlaşması için uğraştığı kütüphanenin bir kısmına Tuhaf bir bir lisanslama niye ayağına kurşun sıkar anlamış değilim...



NVDIA:

Derin öğrenmenin motor gücünü oluşturan GPU ların üreticisi olarak hemen her kütüphaneye destek veriyor. Verdiği desteklerin kütüphanelere zarar vermemesinide temin etmesi lazım diyorum. Digits altında kullanmak için değiştirdiği caffe sürümünü, ana geliştiricilerle ortaklaşa hazırlasaydı, şimdi caffe deki bu dağınıklık olmazdı muhtemelen.


Amazon:

İşlerinin bir kısmına gözünü dikmiş şirketler var ve Koştura koştura çalışıyorlar. Geç  farkına vardılar. MxNet i destekleme kararı aldılar ama bence yeterli destekde bulunmuyorlar halen.


Facebook:

Çok güzel bir ekip kurdular. Çok güzel çalışmalar da yapıyorlar.  Caffe2 ve Torch 'un arkasında durdular. İkisi içinde daha çok çalışmaları lazım. Torch lua sebebiyle popülerliğini kaybetti. Caffe2 ve PyTorch yeni çıktı sayılır. Yaygınlaşabilmeleri için epey bir emek lazım. 


Intel:

Ne yaptıkları belli değil. Beleş tiyolar verelim. 
Kütüphanelerin  cpu optimize halini çıkarmaları hikayedir. Paralel işlem yapabilen donanımlar geliştirip. Bunlara kütüphanelerin kolayca uğraşacağı ara kütüphanelerini yazmaları zorunludur.  Mesela NVDIA nın cuDNN kütüphanesi gibi .
cuDNN, hemen her derin öğrenme kütüphanesinde gpu için kullanılmaktadır. Intelde kendine bir yol seçmeli (OpenCL bazlı gpu larmı olur mi olur Yoksa FPGA mı olur )  
Sonra ona uygun ara kütüphane çıkarmalı
CL_DNN mi olur artık FPGA_DNN mi
Kütüphanelerin kendi donanımlarına adapte edilmesi için destek vermeli
piyasaya girmelidir. 
Hiç bir şey bilmiyorsa Theanoya ve libgpuarray'a destek verimesi lazım.


Son Söz 

Epey bir dağınık oldu kusura bakmayın.  Pek çoğuda şahsi görüş ağırlıklı oldu, o nazarla bakın. Her türlü eleştiri ve önerinizi bekleriz....

Cumartesi, Ağustos 26, 2017

Derin Öğrenmede Kütüphane Savaşları 1

    Artık derin öğrenme - deeplearning- çok moda bir kavram oldu. Her tarafta hakkında bir şeyler söyleniyor. Hiç aklınıza gelemeyecek konularda uygulamalar görüyorsunuz duyuyorsunuz.

Piyasadaki çoğu derin öğrenme kütüphanesi  -framework- açık kaynak kodlu ve ücretsiz kullanıma uygun lisanslı olarak bulunuyor.  Büyük şirketler, İlk etapta para kazanamasa bile, yaygınlık kazanacak , piyasada hakim konuma sahip framework'un sahibi yada hamisi olmak  istiyorlar.  Bunca popülerlik büyük şirketlerinde iştahını kabartıyor yani. Buda  savaşın daha da şiddetleneceğini gösteriyor.

Benim bakış açıma göre savaşın taraflarından ve kütüphanelerden bahsedeyim dedim.
Savaşın taraflarından olan başlıca şirketler ; Google, Facebook, Microsoft, Amazon, Intel...
kütüphanelerle ilgilir görüşlerimler şirketlerin konumlarından da bahsedeceğiz.

Caffe / Digits / Caffe2

Caffe piyasanın en eski kütüphnelerinden  C++ / Cuda temelli. Çoklu GPU deseteği var. Görüntü tabanlı problemler için oturmuş bir yapıda.  Bence ticari olarak doğrudan uygulamaya girebileceğiniz bir kararlılıkta. Benim için en büyük avantajlarından biride windows desteğinin olması. Intelin CPU optimize versiyonu da var. Caffenin OpenCL versiyonuda var.

Digits, NVDIA nın  daha çok Caffe tabanlı  belkide piyasada bulabileceğiniz yegane sağlam GUI . Kod yazma işleri ile fazla boğuşmaya gerek olmadan  yine görüntü tabanlı projeler için kullanabileceğiniz bir program.
  • Nesne Tanıma  - Object Recognition -
  • Nesne Bulma  - Object Detection -
  • Semantik Bölütleme  - Semantic Segmantation -
gibi problemler için doğrudan çalışmaya başlaya bilirsiniz.  Üstelik ülkemizde NVIDIA Deep Learning Institute (DLI) den sertifika alabileceğiniz eğitimi de var. bakınız 
openzeka.com/egitim/  

Caffenin eksikliklerinden bahsedelim.

1) Caffe malesef merkezi güçlü bir yönetime sahip olamadı. Pek çok değişik insan caffe bazlı pek çok değişik çalışma yaptı. Ama bu çalışmalar bölük pörçük sağda solda duruyor.  Ana kod deposuna vakti zamanında birleştirmeler yapılmadığından şimdi istensede bir araya gelemiyor.  Hatta NVDIA bile kendi caffe versiyonunu oluşturdu. Derin öğrenme çok hızlı gelişen bir alan olduğundan kütüphanenin güncel gelişmelere çok hızlı adapte edilmesini gerektiriyor.

2)  Görüntü dışı uygulamalar için gereken yapılar çok geç kütüphaneye dahil edilde ve halen çokda dökümante edilmedi. RNN yapıları gibi. Bu tür ihtiyaçları olan insanlarda başka kütüphanelere yöneldiler.

Caffe2, Başda Facebook olmak üzere değişik firmalar tarafından piyasaya sürüldü. Caffenin popülerliğinden de faydalanarak  daha çabuk yayılmayı hedefleyen bir proje. Vaadleri oldukça parlak;
mesela mobilde çalışma desteği. Henüz deneme şansını bulamadım ama caffe kullanıcısı olarak beni cezbeden bir yanı var.


Torch / PyTorch

Torch aslın da epey eski bir Yapay Öğrenme (ML) kütüphanesidir. Hatta torch'u temel alan bir bilgisayarlı görü kütüphanesi TorchVison hakkında bir yazı yazmıştık. Torch kütüphanesi zamanla değişti. Lua temelli scriptlerle çalışır hale geldi ve Derin öğrenmenin öncüleri tarafından da yaygınlıkla kullanıldı. C / Cuda temelli yapısı ile pek çok ortamda çalışabiliyor. Facebook 'un desteklediği bir proje. Artık windows desteğide varmış. Şahsi fikrim Lua bana sevimli gelmedi. Gerek Yapay Öğrenme gerekse Derin Öğrenmede ana tercih edilen dil python. Bu yüzden hiç kullanmayı düşünmedim.

PyTorch ; Lua dez avantajının onlarda farkına varmışlarki  PyTorch 'u çıkardılar. Çok övülen bir kütüphane ama yolun başında ve Yarışa epey geç katıldı. Halen Windows desteği yok...


Theano

Piyasanın eskilerinden ve malesef garibanlarından. Python temelli esnek bir yapısı olan bir kütüphane. Gariban çünkü doğrudan destek veren büyük bir firma yok. Windowsda kolaylıkla çalıştırabiliyorsunuz.  GPU desteği konusunda bir çalışması - libgpuarray  - var.  Cuda yada OpenCL de de çalışıyor. Türkçesi şu NVDIA gpunuz olmasada, diğer firmaların ürünleri ile derin öğrenmede  GPU kullanabiliyorsunuz. Doğrudan kullanmadım ama Keras 'ın altında theanoyu tercih ediyorum.

devam edecek...


Çarşamba, Ağustos 09, 2017

Windowsda Python için OpenCv kurulumu

 



Yazımınızın ana konusuna geçmeden bir duyuru ve bir soruyala başlayalım.

Önce duyurumuz.
OpenCv 3.3 yayınlandı ;  En bariz fark DNN kısmının  contribden ana dağıtıma aktarılması olarak görünüyor, Darısı epeydir contribde duran diğer kısımlara diyelim. Yeniliklere bakarsak
  • DNN : zaten var olan bir kısımdı ama ana dağıtıma girdi. Ve elbette gelişti. Örneklere göre Caffe 1 , Torch ve Tensorflow modellerini çalışıtrabiliyor.  Bence çok önemli ve yeni derin öğrenme kütüphaneleri desteğiyle güncel tutulması gereken bir kısım. Sadece eğitilmiş modeli kullanmakda eziyet olabiliyor.  DNN ile bu problem bir nebze olsun çözülüyor.
  •  "a language for image processing and computational photography" diye bahsedilen halide desteği gelmiş. Daha net bir şey görünmüyor ama  siftah yapmışlar :)
  • C++ 11 desteği gelmiş
  • Intel Media SDK ile video okuma yazma işlemlerinde donanım hızlanması sağlanmış 
  • Pek çok özellik eklemsi ve hata ayıklaması yapılmış.
Yeri gelmişken bahsedelim OpenCv ilk olarak Intelin Rusyadaki ArGe labaratuvarlarında ortaya çıktı. Ama Intel doğru bir strateji kuramadı. Pek çok hata yaptı
      OpenCv yi,  sattığı IPP kütüphanesine bir payanda gibi sığ bir düşüncesi vardı. Millet opencv öğrenecek  daha hızlı çalıştırabilmek için IPP satın alacaktı hesapta olmadı.
      Sonra bütün bütün elini ayağını çekdi. Buda ayrı bir hataydı. OpenCv gelişmeye devam etti.
 Intel yaptığı hatadan şimdi opencv nin ana geliştiricisi konumunda olan itseez 'i satın alarak dönmeye çalışıyor. İnşallah yine hatalı stratejilere yönelip opencv nin gelişimini engelleyecek adımlar atmaz...

Sorumuza gelirsek. 
"Pythonun pek çok kütüphane desteği var görüntü işleme için opencv kulllanmasak olmazmı ?"
 Benim şahsi görüşüme göre OLMAZ. OpenCv C++ tabanlı olmasıyla, hız olarak kullanmayı düşündüğünüz diğer kütüphanelerin pek çoğunun önüne geçer. İlaveten  OpenCv görüntü işleme ve bilgisayarlı görü alanındaki büyük çoğunluk  tarafından standart kabul edilen bir kütüphanedir. Bu size kaynak bolluğu olarak hemen gelir. OpenCv  kullanarak geliştireceğiniz bir uygulamayı pek çok değişik dile de taşıyabilirsiniz.

Gelelim ana konumuza.

Pythonda OpenCv  kütüphanesini nasıl kuracaksınız?

İlk seçenek OpenCv yi derlemek. Nispeten zor bir yol. Internette derlemenin uzun uzun anlatıldığı pek çok örnek görebilirsiniz, kitabımızda da var. Python için dikkat etmeniz gereken şey  python un kullandığınız versiyon için olan seçeneklerin dolu olması.  



mesela resimde benim derleme için kullandığım cmake dosyasından

derleme sonrasında cv2.pyd  bir dosya oluşturuluyor. Bu dosyayı pythonu kurduğunuz dizin altında
lib/site-packages 
dizinine atın. Eğer derlemeyi statik  yapmaıysanız,  opencv'in dinamik kütüphanelerininde ulaşılabilir yerde - baknız path tanımı - olması lazım.

İkinci ve daha kolay, derlenmiş hazır dağıtımı kullanmak.

Öncelikle sisteminizde Python 2.7.x 64 kurulu olmalı hatta tavsiyemiz. Anaconda dağıtımını kullanmanız.

Python hazırsa artık opencv ye geçelim.
opencv.org/releases.html
adresinden window için derlenmiş dağıtımı indirin


idirdiğiniz dosyayı çalıştırın dosya aslında sadece sıkıştırılmış dosyayı açıyor. Kendinizce uygun gördüğünüz bir dizine açın.

açtığınız dizinde  'opencv\build\python\2.7\x64' kısmında cv2.pyd dosyasını bulun.
lib/site-packages 
dizinine atın. Bu dağıtım statik olarak derlendiğinden sadece
opencv\build\bin
dizininde bulunan  "opencv_ffmpeg330_64.dll"  kütüphanesine bağlıdır.  Bunuda windows -path tanımlı - bir yere taşımanız gerekiyor. mesela pythonu kurduğunuz dizin.

Evet artık opencv python içinden kullanıma hazır.


deneme yapalım
komut satırından pythonu çalıştırın
import cv2
cv2.__version__
yazın  kurulumunzda bir hata yoksa size yüklü olan opencv nin versiyonunu gösteririr.

 Artık python içinden opencv 'yi kullanmaya başlaya bilirsiniz.  Geçen yazımızda bildirmiştik, kitabımızdaki opencv örneklerinin python versiyonlarını yazıyoruz. Yeni dersler eklendi. Yukardaki adımları yaptıysanız. Python örneklerini githubdan klonlayıp inceleyebilirsiniz



 Yazımızın sonuna geldik. her türlü görüş ve önerilerinizi bekleriz.