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