5 Ocak 2017 Perşembe

FPGA ile Yapay Sinir Ağı Tasarımı


FPGA İLE  BASİT NÖRON TASARIMI




Bu yazımda,  bu dönem Yıldız Teknik Üniversitesi Elektronik ABD Doç. Dr. Burcu ERKMEN hocamın vermiş olduğu programlanabilir lojik devre tasarımda dersinde Mehmet Özgen Özdoğan arkadaşımla beraber almış olduğumuz FPGA'de basit bir nöron tasarımı projemizi anlatacağım. 

Öncelikle bu projemizde emeği geçen değerli hocamız Doç. Dr. Burcu ERKMEN ve Arş. Gör. Ali Rıza YILMAZ hocamıza ve aynı zamanda proje arkadaşım Mehmet'e emeğinden verdiği emekten dolayı teşekkür ederim. 

Bu proje sayesinde yapay sinir ağı hakkında daha önce bilmediğim bilgileri bu proje sayesinde hem öğrenmiş hemde fpga gibi zor bir platformda nasıl uygulanacağı hakkında bilgilere sahip oldum. 

Bu projemizde ISE Design Suite 14.7 programını ve Xilinx Spartan 3E eğitim kitini kullandık ve sonuçları kit üzerindeki LCD ekran üstünde hexadecimal sayı olarak görüntüledik.

Yapay Sinir Ağı Nedir ?

Kısaca, yapay sinir ağı insanın beynini taklit eder. Burada hücreyi modeleyerek tasarım yapılıyor. 






Yandaki resimde hücre yapısı görülmektedir. İşte bu hücre yapısı modellenerek YSA oluşturulmuştur.  Burada dendritlere gelen bilgiler hücre gövdesi içersinde değerlendirilerek bir çıkış elde edilir ve o çıkış akson boyunca akson çıkış uçlarına yönlendirilir ve oradan diğer hücrelerin dendritlerine gider. 




Yapay sinir hücreleri biyolojik sinir hücrelerine benzer yapıdadır. Yapay nöronlar aralarında bağ kurarak yapay sinir ağlarını oluştururlar. Aynı biyolojik nöronlarda olduğu gibi yapay nöronların da giriş sinyallerini aldıkları, bu sinyalleri toplayıp işledikleri ve çıktıları ilettikleri bölümleri bulunmaktadır.

Bir yapay sinir hücresi beş bölümden oluşmaktadır;
  • ·         Girdiler
  • ·         Ağırlıklar
  • ·         Toplama Fonksiyonu (Birleştirme Fonksiyonu)
  • ·         Aktivasyon fonksiyonu
  •             Çıktılar 




Giriş ve ağırlık değerleri ondalıklı sayılarda işlem yapacağımız için IEEE 754 standardına göre 32 Bit FloatingNumber yapılarak işlemler bu şekilde ilerledi. FPGA donanımı üzerinde ondalıklı sayılarla işlem yapamadığımız için bu yönteme başvurduk. IPCORE ile fl_carpma ve fl_toplama blokları oluşturduk. Bu blokları 32 Bit tasarladık. Bu sayede giriş değerleri ile ondalıklı olabilecek ağırlıkları ile çarpıp sonunda toplama işlemini yaptırmış olduk. Ağırlıklarını ise W1,W2,W3,W4 sırasıyla 0.5, -0.7, -0.5, 0.32 ayarladık.






Bu ağırlıklar ile çarpım ve toplamlardan sonra elde edilen değeri ise transfer fonksiyonundan geçirmek gerekmekteydi. Burada Sigmoid Fonksiyonu kullandık. Bu sigmoid fonksiyonu 16 bit olduğundan ve 32 bit elde ettiğimiz sonucu kafamıza göre bölemezdik. Çünkü bu kodlama mantığında ilk bit işaret biti sonrasındaki eksponansiyel ağırlıkları ve sonrasında sayı bulunan bir sistemdi. Bu yüzden yine Xilinx ISE Design Studio içerisindeki IPCORE yardımıyla 32 Bit’ten 16 Bit’e düşüren floatingpoint – floatingpoint çevirici ve ardından çıkan sonucu tekrar 32 bit görebilmek için 16 Bit’ten 32 Bit’e çeviren modül tasarladık. Toplama çarpma işlemlerinin 32 Bit sonucu 16 bit sonuca düşürüldü ve ardından sigmoid fonksiyonundan geçirildi. Ardından 16 bit çıkış tekrar 32 Bit’e dönüştüren blok sayesinde 32 Bit yapılarak çıkışa atandı.





Sigmoid fonksiyonu  yaklaşımındaki 16 bit değerlerinin ayrıca sigmoid_rom.vhd bloğunda tutularak ilgili durumlarda adreslere göre değerlerin çekilmesi üzerine oluşturulmuştur.




Bu projenin Spartan 3E 1600E kartına atılıp ve kartın üzerindeki LCD 16x2 ekranında görünmesi için elde ettiğimiz bu 32 Bit sayıyı dörderli gruplara ayırrdık. LCD ekranda HEX değeri okumak için böyle bir işlem uyguladık. 0000 1111 0000 1000 0001 … 32 Bit uzunluktaki sayıyı ekranda okuması zor olacağından HEX değeri yapılarak sonuca gittik. 0x0F081… ekranda yazması daha kolaylık sağlayacaktır. Burada karttaki programın çıkışını LCD’de görmemiz için gerekli komutları ana_modul.ucf dosyası içine tanımladık. Girişleri 4 switch üzerine atadık. Reset için buton kullandık. Ayrıca saat girişi olarak 50 MHz kart üzerindeki clock aktif edildi.




Bu projemizde 4 adet giriş butonu ile giriş değerleri değiştirilmiştir. Bu giriş değerleri kendi katsayıları ile çarpılarak daha sonra aktivasyon fonksiyonunda geçirilmiş ve sonuç LCD'de gösterilmiştir.  





Bu projede sayede ileri yayılım algoritmasını kullandık, geri yayılım algoritmasını fpga üzrinde deneyemedik proje zamanımızın 2 hafta olmasından dolayı. 

Geri yayılım algoritmasının amacı; biz önce sisteme rastgele  W1,W2,W3 ve W4 katsayılarını veriyoruz sonra ileri yayılım algoritması ile çarpma daha sonra toplama ve sonra aktivasyon fonksiyonundan geçirdikten sonra bir çıkış elde ediyoruz. Bu çıkış değeri beklenen değerden farklıdır yani çıkışta hata vardır. Bu hata değeri geri yayılım algoritmasını kullanarak W1,W2,W3 ve W4 otomatik olarak tekrar güncellenir. Bu güncellemeyi sistem kendi kendine yapar. Yani sistem öğrenme durumuna gelir. Bu işlem sistem öğrenene kadar devam eder.  İşte insan beynine benzetilmesinin nedeni de budur. Yani sistem kendi kendini eğite biliyor olmasıdır. 


Sonuçlar



Tüm girişlere lojik 1  değeri verdiğimizde simülasyon sonucu ;



Uygulama sonucu;




   

Kaynaklar 

1.  http://www.ibrahimbayraktar.net/2013/11/sinir-sisteminin-yaps-ve-islevleri.html 
2.  http://mehmetozgenozdogan.blogspot.com.tr/
3. https://www.quora.com/What-is-the-sigmoid-function-and-what-is-its-use-in-machine-learnings-neural-networks
4.http://www.aliosmangokcan.com/index.php/makaleler/46-ysa-ile-xor-uygulamasi
5.http://bilgisayarkavramlari.sadievrenseker.com/2008/10/05/ozel-veya-problemi-xor-problem-exclusive-or/
6.http://www.idt.mdh.se/utbildning/exjobb/files/TR0825.pdf
7.http://www.ijser.org/paper/A-Survey-on-FPGA-based-MLP-Realization-for-On-chip-Learning.html
8.http://www.emo.org.tr/ekler/b8a21b630fcd49a_ek.pdf
9.http://ethesis.nitrkl.ac.in/4217/1/FPGA_implementation_of_artificial_neural_networks.pdf
10.http://www.alicavuslu.gen.tr/wp-content/uploads/2014/02/tez.pdf
11.http://blog.aliekberyacin.net/?p=305#prettyPhoto
12.http://trace.tennessee.edu/cgi/viewcontent.cgi?article=3725&context=utk_gradthes
13.http://web.itu.edu.tr/ayhant/dersler/ysa/dn/ozden.pdf


Hiç yorum yok:

Yorum Gönder