1 Eylül 2010 Çarşamba

Backpropagation Temelli Yapay Sinir Ağı Kütüphanesi

Merhaba , geçen yaz yapay sinir ağlarında geri yayılım algoritmasını öğrenebilmek için araştırmalar yapıyordum. Bunun için c# ile, geri yayılım algoritmasını kullanan basit bir yapar sinir ağı kütüphanesi yazdım. Burada da paylaşmak istiyorum umarım birilerinin işine yarar :)





















Bu araç ile paremetreleri ayarladıktan sonra .txt dosyalarından eğitim verilerini alıp ağı eğitebiliyorsunuz. Eğitim tamamlandıktan sonra, eğer 2 giriş nöronu 2 gizli nöron ve 1 çıkış nöronu seçmişseniz, direkt olarak bu araç üzerinden girdi verip sonuçlarını gözleyebiliyorsunuz ya da farklı bir ağ yapısı seçmişseniz dosyadan okunan eğitim verilerindeki girdilerin, eğitilmiş ağa verildikten sonra sonuçlarını "Dosyadan Alınan Verilere Göre Hesapla" butonu aracılığı ile bir dosyaya yazdırabiliyorsunuz.

Eğitim dosyaları:
0|0#0
1|0#1
0|1#1
1|1#0
şeklinde veri içeren .txt dosyalarından oluşuyor. Örneğin buradaki XOR fonksiyonunun doğruluk tablosu. Dikey çizgiler "|" girdileri ayırıyor son kısımdaki "#" ise çıktıyı belirtiyor.

Nasıl Kullanılıyor?
Sinir ağı ile ilgili parametreleri (katmanlardaki nöron sayıları, aktivasyon fonksiyonu, momentum...) girdikten sonra Ağı oluştur butonu ile sinir ağını oluşturuyoruz. Burada en önemli noktalardan biri; eğer eğitim XOR NXOR gibi doğrusal olmayan fonksiyonlar ile gerçekleştirilecek ise, mutlaka bir gizli katman bulunmalı ve burada en az 2 nöron olmalı. Gizli katman bulunmadığı takdirde doğrusal olmayan problemlerin çözümünde  sonuç elde edilemez.

Ağı oluşturduktan sonra dosyadan veri yükle butonu ile eğitim dosyalarını seçiyoruz. Proje klasöründeki örnek dosyaları kullanabilirsiniz.

Son Olarak Ağı Eğit Butonuna basıyoruz. İterasyonlar sırasında maksimum hata oranın altına inilince eğitim tamamlanıyor. Maksimum hata oranını kodun içinden değiştirebilirsiniz.

Eğitim tamamlanınca 2x2x1 ağ yapısı için yukarıdaki bölümden ya da diğer ağ yapılar için "Dosyadan Alınan Verilere Göre Hesapla" butonu ile sonuçlar hesaplanabiliyor.

Projenin kaynak kodlarını buradan indirebilirsiniz (Microsoft Visual Studio 2010). Zamanında üzerinde baya uğraştığım için kodlama standartlarına hiç dikkat etmedim. Kodlar karışık gelebilir, anlamakta zorlanabilirsiniz. Anlaşılmayan bir yer olursa bana her zaman sorabilirsiniz.

Aynı kütüphaneyi web sayfalarının sınıflandırılması, plaka tanıma sistemi gibi uygulamalarda da kullandım. Vakit bulursam bunları da yazmaya çalışacağım.

9 yorum:

  1. Merhabalar, projenizle ilgili bir şey soracaktım. Projenizde, ağ eğittirildikten sonra ağırlık değerlerini kaydettirip, daha sonraki kullanım veya test aşamalarında bu ağırlık değerlerinden başlattırabilir miyiz? Kodlarınızı inceledim ama tam olarak çözemedim.

    YanıtlaSil
  2. Merhaba ağın kaydedilmesi ile ilgili olarak direkt bir komut yok fakat object serialization yöntemi ile eğitilmiş olan neuralNetwork sınıfının son halini dosya olarak kaydedebilirsiniz.

    Yukarıda bahsettiğim "Dosyadan alınan verilere göre hesapla" butonu ağı eğittikten sonra deneme yapmak için inputların dosyadan okunmasını sağlamaktadır. Yani önceden eğitilmiş bir ağın dosyadan okunması söz konusu değil.

    Umarım sorunuza açıklama getirebilmişimdir.

    YanıtlaSil
  3. Geri bildirim için teşekkürler.Kodlamanızı çok iyi anladım fakat programlamada ve c# ta yeni olduğumdan, kodlarınızı kendime göre değiştiremedim.
    Projemde lazım olan şey: eğitilmiş ağ sonucundaki nöron ağırlıklarını almak ve bu ağırlıkları kaydettirmek. Daha sonra sizin proje de ratgele olarak atanan ağırlıkları, bu önceden kaydettirilmiş ağırlıklardan başlatmak...

    OOP güzel fakat benim gibi deneyimsizler için kullanmak zor oluyor. Bana bu konuda yardımcı olabilir misiniz?

    YanıtlaSil
  4. Merhaba şu bağlantılardaki örnekleri inceleyip benzer şekilde koda uygulayabilirsiniz.

    http://www.codeproject.com/KB/cs/objserial.aspx

    http://www.csharpnedir.com/articles/read/?id=687&title=Binary%20Serialization%20ile%20Verilerin%20Saklanmas%C4%B1%20ve%20DataTable%20Kullan%C4%B1m%C4%B1

    Bunun dışında eğer hazır bir kütüphane işinize yarayacaksa aforge u öneririm;
    http://www.aforgenet.com

    YanıtlaSil
  5. Yardımlarınız için teşekkürler.
    Çalışmalarınızda başarılar.

    YanıtlaSil
  6. Selamlar, en son girdiğiniz blog 2010 olarak görünüyor. Blogunuzu yeni keşfettim çok güzel yazılarınız varmış. Bırakmayın bence yazmayı :)

    YanıtlaSil
  7. İlginize çok teşekkür ederim, yakın zaman da yeni yazılar yazmayı düşünüyorum.

    YanıtlaSil
  8. kaynak kod linki geçersiz galiba tekrar yükleyebilirseniz çok sevinirim

    YanıtlaSil
  9. Sanırım linkte problem var. Yenileyebilir misiniz.

    YanıtlaSil