MATLAB İle Yapay Sinir Ağı Uygulaması

MATLAB İle Yapay Sinir Ağı Uygulaması

8 Kasım 2011 0 Yazar: İbrahim AY
1 Star2 Stars3 Stars4 Stars5 Stars (Oy verilmemiş. İlk oy veren olur musun?)
Loading...

İleri Beslemeli Çok Katmanlı Ağ

İleri Beslemeli Çok Katmanlı Ağ

Bu eğitimin komutu newff’dir. Bu eğitimin temsili ve denklemi için basit bir örnek aşağıdaki gibidir. İlgili temsil eğitim ağımıza göredir.

net=newff(minmax(ABCD),[3,1],{‘tansig’,’purelin’},’trainlm’);

İleri Beslemeli Çok Katmanlı Ağ

Adım adım anlatmaya çalışayım. A,B,C,D girişleri rastgele iw katsayıları ile çarpılıp b1 sabiti ile toplanıyor. İlk derste anlattığım gibi (regresyon denklemi gibi).Elde edilen sonuç 3 nöronlu tansig denkleminin 1. nöronundan geçiriliyor. Tansig fonksiyonu 2/(1+exp(-2*n))-1 şeklindedir. Burada exp doğal logaritmayı (e) ifade etmektedir. Sayısal örnekte göreceğiz. Tansig yerine logsig(n) = 1 / (1 + exp(-n)) gibi farklı denklemler ile eğitim yapılabilir. Ancak YSA’da ki her denklem bu tip sayısal işlemlere uymaz. Mesela hardlim(n) ( 1 if n>=0) denklemi var ki çıktı’nın 0’dan büyük veya eşit olmasına göre sonucu 1 varsayıyor. Devam edelim. Yeni sonuçlar bir sonraki adımda iw2 katsayıları ile çarpılıp b2 sabiti ile toplanarak purelin fonksiyonuna sokuluyor. Purelin fonksiyonu n=n’dir, yani çıktının kendisidir. Purelin yerine tansig, logsig vb kullanabilir veya deneyebilirsiniz. En sonda ki trainlm komutu ise Levenberg-Marquardt geri yayılım algoritmasının kullanılacağını ifade eder. Bundan başka trainbfg, trainbr, traincgb, traincgf, traincgp, traingd, traingda, traingdm, traingdx, trainoss, trainrp, trainscg, trainb, trainc, trainr gibi algoritmalar mevcuttur.

Ağı daha çok katmanlı ve daha çok nöronlu yaparsak sayısal işlem muazzam derecede artar ve ben size anlatamam. Siz çalışmalarınızda uygularsınız o başka. Mesela;

İleri Beslemeli Çok Katmanlı Ağ tnasig-logsig
net=newff(minmax(ABCD),[20,30,1],{‘tansig’,’logsig’,’purelin’},’trainlm’);

Burada bağımsızlar katsayılar ile çarpılıp sabit ile toplanıyor. 20 nöronlu tansig denkleminin 1 nöronundan geçiyor. Bu diğer katsayılar ile çarpılıp, toplanıp 30 nöronlu logsig denklemine sokulup purelinden çıktı alınıyor. Birazdan net=newff(minmax(ABCD),[3,1],{‘tansig’,’purelin’},’trainlm’); işleminin sonucunu sayısal olarak değerlendirdiğimde ne demek istediğimi anlayacaksınız. Ondan önce ağı eğitirken bazı yardımcı kodlar kullanmamız gerekebiliyor.

net.trainParam.show = 5; komutu eğitimin ilerleyişini kaç döngüde bir göstereceğini ifade eder.

net.trainParam.epochs = 300; komutu eğitimin kaç döngüye kadar yapılacağını ifade eder. Yukarıda hesaplama hakkında dilim döndüğünce bir şeyler anlatmıştım. O anlatım bir döngüdür. Aynı işlemi azami kaç kere yapsın sorusuna burada 300 cevabını vermiş oluyoruz ki eğitim başarılı olmaz ise ya işlemi yenileriz veya bu döngü sayısını arttırırız. Döngü sayısını arttırmak çalışmayı bozmazsa da çok fazla olursa eğitim ezberlemeye dönüşür ve eğitim dışında ki yeni verilerin kontrolü çok başarısız olabilir.

net.trainParam.goal = 1e-5; Bu komut, hata karelerinin toplamı kaç olduğunda döngü sonlansın sorusuna cevaptır. Eğer yukarıda verdiğimiz azami 300 döngü sonunda bu hata oranına ulaşılamazsa eğitim başarısız demektir.

net.trainparam.min_grad = 1e-10; Ağın performans değeri. Düşük olursa istediğimiz MSE değerine ulaşamayabiliriz, bu anlamda yüksek tutmakta fayda var.

Şimdilik bunlar yeter. Benzer yardımcı kodları MATLAB Help’ten öğrenebilirsiniz.

Son olarak eğitime aşağıdaki komutla başlarız;
[net,tr]=train(net,ABCD,Ra);

Elimizde ki veriler ile eğitime başlayalım. Aşağıda ki kodlarımda ki sayılar genel uygulamalara göre farklıdır. Veri sayımın azlığından ziyade dersi anlatabileceğim nöron sayısı ile eğitimi tamamlama şansım zayıf. Bu nedenle hedef hata kareleri toplamını ve bazı değerleri yüksek tuttum.

net=newff(minmax(ABCD),[3,1],{‘tansig’,’purelin’},’trainlm’);
net.trainParam.show = 50
net.trainParam.epochs = 3000
net.trainParam.goal = 1e-1
net.trainparam.min_grad = 1e-10

newff

newff İleri Beslemeli Çok Katmanlı Ağ

[net,tr]=train(net,ABCD,Ra);

Eğitim - Train

369 döngü sonunda hedeflediğim 1e-1’lik MSE değerini yakaladım. Eğer başarılı olamaz isek [net,tr]=train(net,ABCD,Ra); ile eğitimi tekrarlayabiliriz. Ama öncelikle net = init(net); ile eğitimi sıfırlamamız iyi olur. Şimdi çıktımızı alalım ve gerçek değerlerle beraber görelim.
>>sonuc=sim(net,ABCD)
>>Ra
Yapay Sinir Ağ Sonuçları

Şimdide ağırlıklarımızı ve sabitlerimizi alarak ağın denklemini çıkaralım. Burada işleyişi anlatmak için denklemleştiriyorum. Yoksa uygulamalarda o kadar çok nöron ve katman kullanırız ki denkleme dökmek zulümdür. Hatta katsayıları bile vermeyiz. Kim yazacak o kadar kalabalığı. Ama yazmakta fayda var. Katsayılar için şu komutları kullanabiliriz;

iw = net.iw
lw = net.lw
b=net.b

Yapay Sinir Ağ Katsayı Al

iw

lw1

lw2

b

Giriş-İşlem-Tansig-İşlem-Purelin-Sonuç

Verileri tablodan detaylı okumaya ihtiyaç duymaz iseniz aşağıdaki komutlar ile de ekrana bastırabilirsiniz:

bias1 = net.b{1}
bias2 = net.b{2}
weightsiw = net.iw{1}
weightslw = net.lw{2}

Katsayılarımız şöyle

iw11-12-13b1
-0.48250.081614.30992.7074-19.1999
-3.01580.102829.42715.8476-16.541
-0.42660.0177-3.0998-3.66410.0644
lw21b2
0.830349.3917-26.492625.5336

Ağın denklemini daha anlaşılabilir olması için parçalı gösteriyorum:

1.nörona ==> -0.4825*A + 0.0816*B + 14.3099*C + 2.7074*D + -19.1999 = N1
2.nörona ==> -3.0158*A + 0.1028*B + 29.4271*C + 5.8476*D + -16.541 = N2
3.nörona ==> -0.4266*A + 0.0177*B + -3.0998*C + -3.664*D + 10.0644 = N3

Şimdide tansig fonksiyonundan geçiriyoruz:

Sonuç ==> {[2/(1+exp(-2*N1))-1]*0.8303} + {[2/(1+exp(-2*N2))-1]*49.3917} + {[2/(1+exp(-2*N3))-1]*-26.4926} + 25.5336

Not: exp(a)’nın ekselde çözümü üs(a)’dır. Veya matematikte e^a demektir. Misal exp(5)=üs(5)=e^5=148.4132

1. verinin çıktısını bulalım (17, 120, 0.2, 2)

1.nörona ==> -0.4825*17 + 0.0816*120 + 14.3099*0.2 + 2.7074*2 + -19.1999 = N1 = -9,33362
2.nörona ==> -3.0158*17 + 0.1028*120 + 29.4271*0.2 + 5.8476*2 + -16.541 = N2 = -37,89298
3.nörona ==> -0.4266*17 + 0.0177*120 + -3.0998*0.2 + -3.664*2 + 10.0644 = N3 = -3,01176

Sonuç ==> {[2/(1+exp(-2*-9,33362))-1]*0.8303} + {[2/(1+exp(-2*-37,89298))-1]*49.3917} + {[2/(1+exp(-2*-3,01176))-1]*-26.4926} + 25.5336

Sonuç ==> -0.8303 – 49.3917 + 26.3646 + 25.5336 = 1.6762

YSA çıktımız 1.6757’dir. Biz 1.6762 bulduk çünkü katsayılarda virgülden sonra 4 hane kullandık. Dolayısıyla bu kadar hatalı hesaplamamız çok doğal.

İçindekiler

Sayfalar: 1 2 3 4 5 Tümü