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.

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ıtlaSilMerhaba 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.
YanıtlaSilYukarı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.
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.
YanıtlaSilProjemde 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?
Merhaba şu bağlantılardaki örnekleri inceleyip benzer şekilde koda uygulayabilirsiniz.
YanıtlaSilhttp://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
Yardımlarınız için teşekkürler.
YanıtlaSilÇalışmalarınızda başarılar.
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İlginize çok teşekkür ederim, yakın zaman da yeni yazılar yazmayı düşünüyorum.
YanıtlaSilkaynak kod linki geçersiz galiba tekrar yükleyebilirseniz çok sevinirim
YanıtlaSilSanırım linkte problem var. Yenileyebilir misiniz.
YanıtlaSil