Sunday 4 June 2017

MİCROSOFT’un Yüksek Performanslı , Açık Kaynaklı Deep Learning Aracı : Cognitive Toolkit

Microsoft Cognitive Toolkit 2.0 yakın zamanda genel erişime açıldı. Bu araç kullanıcılara kendi  neural networklerini kurmalarını ,eğitim veya test yapmalarını hatta  bu networkleri birden fazla makine üzerinde çalıştırılmasına imkan sağlayan bir çalışmadır. Ayrıca DL (Deep Learning)  çalışmalarında bir disiplin olarak kabul edilen “distributed computing” yani işlenecek verinin GPUlar üzerine verimli şekilde ölçeklenerek dağıtılması işlemini de desteklemesi en önemli özelliklerindendir.


Önceden CNTK olarak bilinen bu aracın 2.0 veriyonu; 2016 Ekim’de Beta sürümü olarak çıktı ve 3 Nisan 2017’de genel kullanıma sunuldu.  Bu süreçte çeşitli upgrade işlemlerinden  bazıları şunlardır:

·        Araç içerisine doğrudan Keras kütüphanesi kullanılabilmesi
·        Modellerin değerlendirmeleri için  Java binding[4] ve  Spark[5] desteği
·         Eğitilen modellerin hızlı değerlendirilmesi için model sıkıştırma işleminin yapılması
..

Bu gibi upgradelerden sonra literatürdeki en hızlı çalışan DL framework’ü olmuştur. Yakın zamanda tek bir GPU üzerinde yapılan testler Şekil 1’de gösterilmiştir.

Şekil 1. Tek GPU ile Analizler[5]

Çoklu GPU üzerinde de oldukça başarılı sonuçlar alınmaktadır. Mesela; NVIDIA’dan son sürüm VOLTA GPU kullanarak elde edilen test sonuçları Şekil 2’deki gibidir.

Şekil 2. Çoklu GPU analizleri

Microsoft Cognitive Toolkit’in genel kullanıma açılması sebebiyle 3 yeni özellikten bahsetmek yerinde olacaktır:

1.      KERAS desteği:  Keras API  kullanıcıların AI uygulamaları geliştirmeleri için tasarlandı ve kullanıcı deneyimleriyle optimize edildi.  Keras “cognitive load” dediğimiz bilişsel yükü azaltmak için en iyi pratikleri  uygular: tutarlı ve basit API’ler sunar, ortak kullaımlar için gerekli kullanıcı hareketlerini en aza indirir ve  Kullanıcı hataları üzerine net ve uygulanabilir geri bildirim sağlar. Keras; daha önce ML(Machine Learning) tecrübesi olmayan binlerce insana DL uygulaması gerçekleştirmesine imkan sağlamıştır. Keras kullanıcıları şimdi  var olan modellerine herhangi bir değişiklik yapmadan MS Cognitive Toolkit kullanarak faydalanabilmektedir. MS geliştirici ekibi Keras desteğini geliştirmeye devam ettiğinde şu anda “public preview” aşamasındadır.

2.      JAVA BINDINGs ve SPARK desteği :   İster Python olsun ister Brainscript kullanılarak  model  eğitiminden sonra, MS Cognitive Toolkit çok sayıda değerlendirme için yöntem sağlamaktadır. Şimdi GA(Generally Avaliable) modülünün çıkmasıyla; kullanıcılar yeni Java API’de modellerini değerlendirebiliyorlar. Bu yaklaşım ile kullanıcılar JAVA uygulamaları içine DL modellerini rahatlıkla entegre edebilmektedir.

3.       Model Compression (Model Sıkıştırma):  Eğitimli bir modelin mobil ürünlerdeki alt uç CPU'larda değerlendirilmesi, gerçek zamanlı performans elde etmeyi zorlaştırabilir.  Bu yaklaşım özellikle, bir fotoğraf makinesinden gelen gerçek zamanlı videoda görüntü öğrenimi için eğitilmiş modelleri değerlendirmeye çalışırken doğrudur. MS Cognitive Toolkit GA ile, tam hassas muadillerine kıyasla birkaç kat daha hızlı olan birkaç FP(Floating Point) operasyonunun nicelenmiş uygulamalarına izin veren uzantıları ekleyebiliyoruz.  Bu hız artışı, server ve düşük güçlü gömülü cihazlar üzerinde , değerlendirme doğruluğunun az bir kayıpla ve hızlı şekilde modellerin değerlendirilmesi için oldukça yeterlidir.


Bu yazıda genel olarak MS Cognitive Toolkit hakkında bilgi verilmiştir.
 MS geliştiricileri en büyük rakibi olan Tensorflow yerine bu aracın seçilmesinin gerekçelerini detaylı şekilde belirtmiştir[6]. O yüzden bu yazıda bahsedilmeyecektir.

Bence denemeye değer….

İyi çalışmalar..

Adana Bilim ve Teknoloji Üniversitesi
Müh. Ve Doğa Bilimleri Fakültesi
Bilgisayar Müh.
Ar. Gör. YASİR KILIÇ



KAYNAKLAR
[6] https://github.com/Microsoft/CNTK/wiki/Reasons-to-Switch-from-TensorFlow-to-CNTK

Friday 7 April 2017

TENSORFLOW : Google Makine Öğrenmesi Kütüphanesine Giriş



Şekil 1. Tensorflow
 Tensorflow  graflar arasındaki veri akışındaki sayısal hesaplamaların (numerical computation)  yapılabildiği bir makine zekası kütüphanesidir. Aslında bu tanım Google tarafından yapılmış olsa da günümüzde Deep Learning çalışmalarında oldukça popüler kullanımı sebebiyle aynı zamanda “Deep Learning Library” olarak da ifade edilebilir. Bu kütüphane(TF)  Google tarafından açık kaynak olarak sunulmaktadır. Resmi sitedeki yönergeleri takip ederek kütüphaneyi kullanabilirsiniz. Şu anda 2 dilde API mevcuttur: C++, Python. Ancak gerek hızlı işlem yapma kapasitesi gerek topluluk desteği gibi avantajlarından ötürü Python dili  tercih edilmektedir. (Baknz : Tensorflow Web sitesi)


Tensorflow içerisinde data n-boyutlu bir dizi olarak sunulur. Bu n- boyutlu dizilere  de TENSOR adı verilir.  Graflar bu veriler(Tensor) ve matematiksel işlemlerden oluşur. 
Graflardaki Düğümler(Nodes on the Graph):  Matematiksel işlemleri temsil eder.  (Nodes=Operations)
Graflardaki Kenarlar(Edges on the Graph )  : İşlemler arası akan verileri(Tensor) temsil eder.(Edges=Tensors)

Aşağıdaki imgede basit bir TensorFlow  diyagramı örneği  gösterilmiştir.  Anlaşılacağı üzere TensorFlow diyagramı düğümler (nodes)  oval şekilde ve kenarlar(edges)  ise dikdörtgen şekilde ifade gösterilmiştir. 
Şekil 2. Örnek bir Tensorflow grafı
Tensorflow’un bu özellikleri kullanıcılara karmaşık modelleri bile esnek biçimde tasarlama fırsatı tanımaktadır. Aynı zamanda graflar arası akışın adım adım takip edimesi ve hesaplamaların incelenmesi de mümkündür. Bunun gibi birçok üstün özellikleri sayabiliriz TensorFlow için…

Gelelim grafların modellenmesine  yani Tensorflow kütüphanesini kullanmaya…
Temel Yaklaşım: Başlangıçta graf oluşturulur ve graf  herhangi  bir veriye sahip olmaz. Daha sonra graf oluşturma tamamlandıktan sonra bir ‘Session ’ içerisinde run edilmesi gereklidir.
Gelelim Python Komut satırından kütüphaneyi kullanmaya … İlk olarak kütüphane import edilir. 
Şekil 3. Tensorflow import edilmesi
 2.GRAPH(Graf):
Graflar Tensorflow’un temelidir denilebilir. Çünkü her bir hesaplama/işlem/değişken graf üzerinde yapılmaktadır.
Kod içerisinde yapılan herbir şey Tensorflow tarafından sağlanan default Graflar üzerinde tutulur. Bu grafa Tensorflow kütüphanesinin “get_default_graph()” metodu ile erişebiliriz.

PYTHON kodu>>>graph=tf.get_default_graph()

Graflar üzerinde yapılan tüm işlemlere grafların “get_operations()” adlı metoduyla erişilebilir. Şu anda çalıştırıldığında “[]” şeklinde bir çıktı verecektir. Çünkü graf üzerinde yapılan herhangi bir işlem bulunmamaktadır.

PYTHON Kodu>>> graph.get_operations()

Graf üzerinde yapılan tüm işlemlerin isimlerini öğrenmek için şu şekilde bir kod yazılabilir:

PYTHON Kodu>>>for op in graph.get_operations() : print(op.name)

3.SESSION(Oturum):
Graflar bildiğimiz gibi işlemleri tanımlamak için kullanılıyordu ama bu işlemler sadece bir Session(oturum) içerisinde run edilir. Graflar ve Sessionlar birbirinden bağımsız şekilde oluşturulur. Aslında graflar oluşturulan modelin teknik bir taslağı iken Sessionlar ise yapılan işin çalışma sahasına benzer.  
Graflar sadece  hesaplamaları belirler ve teknik taslağı oluşturur. Bir Session içerisinde graf veya grafın bir kısmı çalıştırılmadığı sürece grafda ne bir değişken ne bir değer vardır. Bir Session şu şeklilde oluşturulabilir:
PYTHON Kodu:
sess=tf.Session()
#…Yazılmak istenen kod buraya yazılabilir.
sess.close 

Bir Session başlatıldığında sonlandırlması gerektiği unutulmamalıdır. Alternatif olarak ‘with block’ yapısı kullanılabilir.
PYTHON Kodu:
with tf.Session() as sess:
                sess.run(f)
Bu şekilde kullanımın en önemli avantajı Session’ın otomatik olarak kapanmasıdır. ‘With’ bloğunun sonlanmasıyla Session da sonlanacaktır. Bu şekide kullanım oldukça popülerdir ve şiddetle tavsiye edilmektedir.
4. TENSORS(N-Boyutlu Diziler):
Tensorflow verileri n-boyutlu dizilerde(Tensors) tutar . Tıpki NUMPY n-boyutlu dizileri gibi. Ancak Tensorflow’un oldukça fazla üstün yanları vardır.
a)      Constants(Sabitler):  Değerleri değişmeyen verilerdir. Şu şekilde tanımlama yapılabilir:
PYTHON Kodu:
 A=tf.constant(5.0)
print(A)
Ancak burada Tensorflow’un diğer programlama dillerinden farkı belirmektedir. Yukarıdaki gibi bir kod yazıldığında ‘A’ sabitinin değeri olan 5.0 çıktı olarak verilmeyecektir. Çünkü bir session başlatılmadan değer ataması yapılamaz Tensorflow’da…
Bu koda Session başlatılarak değer çıktı verilmesi gerekmektedir.

PYHON Kodu:
with tf.Session() as sess:
                sess.run(A)
şeklinde bir kod yazılırsa 5.0 değeri çıktı olarak alınabilecektir.

b)      Variables(Değişkenler):
Şu şekide tanımlama yapılabilir:

PYTHON Kodu:
B=tf.Variable(10.0,name=”test_degisken”)

Tensorflow içerisinde bu değişkenlerin kullanılabilmesi için “initialize” edilmesi gerekmektedir. Bu konuda Tensorflow sağladığı mekanizma ile sorunu bir satır kod ile halletmektedir.
Eğer TF versiyonu 0.11 ve daha öncesi ise => “init_op=tf.initialize_all_variables()”
Eğer TF versiyonu 0.12 ve daha sonrası ise=> “init_op=tf.gloabal_variables_initializer()”
Şeklinde kullanılır ve değişkenler ‘initialize’ edilmiş olur.Daha sonra bu değişken default grafa eklenir ki bu değişkene erişim mümkün olsun…

PYTHON Kodu:
with tf.Session() as sess:
                sess.run(init_op)
                print(sess.run(B))

şeklinde bir kod yazarak B değişkeni olan 10.0 değeri çıktı olarak verilir.

c)       PlaceHolders(Yer Tutucular):İnitialize(ilkleme) ve Fed(veri besleme) bekleyen tensorlardır.  PlaceHolder’lar  eğitim zamanında parametrelerin belirlenmesinde kullanılabilir. PlaceHolder’lar için veri beslemesini  key,value ikiliğini kullanarak veri tutan ‘feed_dict’ adlı yapı sağlar. Mesela örnek bir çalışma olarak 2 sayının çarpımını ekrana basalım.

PYTHON Kodu:
a=tf.placeholder("float")
b=tf.placeholder("float")
y=tf.mul(a,b)   # iki sayının çarpımılmesi
feed_dict={a:5.0,b:10.0}  # verilerin beslenmesi. Mesela eğitim  esnasında güncellenen verileri bu şekilde bir yapıyla besleyebiliriz.
with tf.Session() as sess:   #graf yapısının üzerinde işlem yapabilmek için Session başlatılıyor
                print(sess.run(y,feed_dict))   # ‘feed_dict’ parametresine bağlı olarak çarpma işlemi yapılıyor. 


5. DEVICE in TENSORFLOW(TENSORFLOW’da AYGIT )
Tensorflow’un diğer numerik hesaplama kütüphanelerin oldukça fazla üstün yanları vardır. Bunlardan en önemlilerinden birisi de dağıtık programlamaya imkan sağlayabilmesidir. Yazılan kod içesinde farklı Session’lar oluşturarak her Session farklı bir aygıt kullanılabilmektedir.  Mesela bir görevi CPU ile diğer bir görevi GPU kullanarak yapmak gibi.  

Şekil 4. Tensorflow  dağıtık programlama
 Şekilde bir dağıtık hesaplama örneği mevcuttur. Bir ANN(Artificial Neural Network) modelinin geliştirilmesi aşamasında yapılan bir yük dağılımıdır. TF bu gibi özellikleri kullanıcılara sağlamaktadır.
Burada önemli bir ayrıntıyı belirtmekte fayda var: İş yükü dağılımı yapıldıktan sonra her bir iş yükü için ayrı bir Session başlatılması gerekmektedir.

BASİT BİR TENSORFLOW ÖRNEĞİ :

Bu aşamada adım adım Linear Regression örneği yapılacaktır. Ama bundan önce gerekli metodları tanımlamaya çalışalım:
a)       Rasgele Normal Dağılım Oluşturma: Bu örnek için 784*10  büyüklüğünde ve standart sapması 0.01 olan bir dağılım oluşturalım. Bu dağılım ağırlıklar(W) olarak kullanılacaktır.
PYTHON Kodu:
W=tf.Variable(tf.random_normal([784,10],stddev=0.01))

b)      Reduce_Mean: Verilen bir dizinin ortalamasının bulunması gerekmektedir.
PYTHON Kodu:
b=tf.Variable([10,20,30,40,50,60],name="t")
with tf.Session() as sess:
                sess.run(tf.global_variables_initializer())
                print(sess.run(tf.reduce_mean(b)))

şeklindeki bir kod ile b dizisinin ortalamasını bulabiliriz.
c)       ArgMax: Özel olarak belirlenen eksenler arasındaki max değerin elde edilmesi
Python Kodu:
a=[
   [0.1,0.2,0.3],
   [20 ,2  ,3  ]
]
b=tf.Variable(a,name='b')
with tf.Session() as sess:
                sess.run(tf.global_variables_initializer())
                print(sess.run(tf.argmax(b,1)))

şeklindeki kodun çıktısı her satırdaki max değerlerin indexi olacaktır. Yani: [2,0] .

Linear Regression Örneği:
Öncelikle Linear Regression kısaca problem uzayından verilerin sınıflandırılması için belirli lineer bir doğrunun çıkarılması işlemidir. Bu işlem genellikle ANN yapısı kullanılarak çözülmeye çalışılmaktadır.
Yapacağımız örnek için 100 adet veri noktası oluşturulacak ve daha sonra bu verileri ifade eden eğri elde  edilmeye çalışılacaktır.
Adım1: Eğitim datasının oluşturulması:
Python Kodu:
import tensorflow as tf
import numpy as np

trainX=np.linspace(-1,+1,101)
trainY=3* trainX+ np.random.randn(*trainX.shape)*0.33

şeklinde kod yazarak verileri oluşturduk. Veriler tamamen rasgele varsayımlarla şu şekilde oluşmuştur.  Sırasıyla (TrainX ve TrainY değerleri )
Şekil 5. Eğitim için koordinat sistemi için veriler
 Oluşturulan bu veriler sonrasında şu şekilde bir grafik oluşmuştur:
Şekil 6. Şekil 5'teki verilerin koordinat sistemine yerleşmiş hali

Adım2: PlaceHolder oluşturulması:
Python Kodu:
x=tf.placeholder("float")
y=tf.placeholder("float")

Adım3: Modelin oluşturulması:
Linear Regression modeli aslında “y_model=w*x” denkliğine dayanır. Modelin eğitimi sırasında W değerleri optimize edilir.  Cost parametresi için ise “cost=(y_model-y)^2” şeklinde bir denklik kullanılabilir.  Bu aşamada Tensorflow ağırlıkların optimize edilmesi için her bir iterasyonda ağırlık güncellemelerini yapar. Bu çalışmada oldukça popüler bir teknik olan “GradientDescentOptimizer” kullanılacaktır. Parametre olarak “learning rate” değerini almaktadır.
Python Kodu:
w=tf.Variable(0.0,name="weights")
y_model=tf.mul(x,w)
cost=(tf.pow(y-y_model,2))
train_op=tf.train.GradientDescentOptimizer(0.01).minimize(cost)

Adım4: Eğitim yapılması:,
Bu aşamaya kadar sadece grafı tanımladık. Herhangi bir hesaplama yapmadık. Bu aşamada ‘Session’ oluşturarak eğitim işlemi yapılacaktır.   Tabi öncelikle değişkenlerin “global_variables_initializer()” metodu ile initialize edilmesi gerekmektedir.
Python Kodu:
init=tf.global_variables_initializer()  # değişkenlerin init edilmesi
with tf.Session() as sess:    
                sess.run(init)
                for i in range(100):       # 100 epoch
                                for (x,y) in zip(trainX,trainY):
                                                sess.run(train_op,feed_dict={X:x,Y:y})    # ağırlıklar optimize edilir.
                print(sess.run(w))    # en son olarak belirlenen ağırlık ekranan yazdırılır.

Şeklinde kod yazarak eğitim işlemi 100 iterasyon ile yapılmış oldu. Amaç eğrinin y=w*x şeklinde ifade edilmesiydi.  Bu eğitim kısmında w değerinin optimize edilmesi gerçeklendi.  Veriler rasgele oluşturulmasına rağmen y değerinin denklemini biz belirlediğimiz için w değerinin 3 değeri civarında bir değer olduğunu tahmin edebiliriz.
Sonuç olarak sıklıkla yapılan bir hatadan bahsetmekte fayda var. Daha önceden Session olayından bahsetmiştik. Aslında hesaplamaların döndüğü kısım olarak da ifade edebilmiştik. Buna bağlı olarak da her session kendine özgü hesaplamalara sahiptir, diyebiliriz. Mesela ; yukarıda yazdığımız koda ilave olarak şöyle bir Session oluşturalım:
Python Kodu:
 with tf.Session() as sess:
                sess.run(init)
                print(sess.run(w))
Bu kodun çıktısı ne olabilir? Cevabımız çok basit: Tensorflow mimarisi gereği 0.0 !!! Çünkü farklı bir Session içerisinde aynı değerlerin elde edilebilmesi için aynı hesaplamaların yapılması gerekmektedir…

SONUÇ:
 Bu yazıda WEB üzerinde çeşitli dökümanları kullanarak TENSORFLOW kütüphanesinin giriş seviyesinde bilgilerini aktarmaya çalıştım. Bir nebze olsun faydam olduysa ne mutlu bana…J
Gerek Deep Learning ile ilgili gerekse Tensorflow ile ilgili öğrendiğim şeyleri fırsat buldukça paylaşmayı düşünüyorum.
Teşekkürler. Kolay gelsin . İyi çalışmalar…

NOT: Buradan Standford Üniversitesi'ndeki "Tensorflow for Deep Learning" dersini takip edebilirsiniz. Oldukça faydalı dökümanlar mevcut.  

YASİR KILIÇ
SELÇUK ÜNİVERSİTESİ
FEN BİLİMLERİ ENSTİTÜSÜ
Bilgisayar Mühendisliği (Tezli Yüksek Lisans öğrencisi)
MAİL:  14yasir@gmail.com

KAYNAKLAR:

[3] http://web.stanford.edu/class/cs20si/syllabus.html 









Friday 24 March 2017

"Text2MusicTR": Türkçe Metinlerden Melodi Oluşturma Yazılımı


Selçuk Üniversitesi Bilgisayar Mühendisliği Bölümü 2015-2016 dönemi bitirme projesini arkadaşım Senih Aydın ve danışman hocamız Yrd. Doç. Dr Nurdan AKHAN BAYKAN ile tamamladık.

Yaptığımız çalışmada Metinlerin duygu profilini çıkarıp melodi haline getiren bir yazılım gerçekleştirmeyi başardık .  Bu çalışma yapılırken referans çalışmamız Hannah Davis ve Saif Mohammad tarafından önerilen "TRANSPROSE" algoritması olmuştur. (Bknz: TransProse)

Ayrıntılı bilgi tez raporumuzda mevcuttur. Genel olarak kullanıcı tarafından upload edilen bir metnin(hikaye,roman,şarkı sözü...) paragraflarına ayrılması ve daha sonra her paragrafın duygu profilinin çıkarılması ve daha sonra JFUGUE müzik programlama kütüphanesi yardımıyla melodiye dönüştürülmesi işlemidir.

Duygu profili çıkarılırken 5 temel duygu belirlendi : mutluluk, coşku, duygusal,hüzünlü,korku .  Abstract Feature Extraction algoritmasıyla  metnin duygu profili belirlendi .  Mesela;  Şekil 1'de "Kırmızı Başlıklı Kız" romanının  duygu profili  yazılım çıktısı olarak belirtlilmiştir.

Şekil 1. Yazılım tarafından metnin duygu profilinin çıkarılması



Ayrıntılı bilgiye ulaşmak için tez raporumuzun linki şu şekildedir: Text2MusicTR

Yakın zamanda çalışmayla ilgili de  demo yapacağım inşallah.

Kolay gelsin . İyi Çalışmalar

İletişim:
YASİR KILIÇ
Mail: 14yasir@gmail.com