www.aliosmangokcan.com

Bu çalışmada C ++ kullanarak f (x) = sin (x) değerini tahmin etmek için basit bir geri yayılım algoritmalı (back propagation algorithm) yapay sinir ağı gerçekleştirilmiştir. En başarılı ve kullanışlı sinir ağlarından biri, ileri beslemeli sinir ağları veya çok katmanlı algılayıcı sinir ağlarıdır (MLP).

Bu tür sinir ağı aşağıdaki gibi üç bölüm içerir:

  1. Giriş Katmanı
  2. Gizli Katmanlar
  3. Çıktı Katmanı

Her katmanın, ağdaki diğer nöronlara bağlanan birkaç düğümü vardır. Her sinir ağının aşağıdaki gibi beş önemli özelliği vardır:

  1. Giriş düğümü sayısı
  2. Gizli katman başına düğüm sayısı
  3. Çıkış düğümü sayısı
  4. Gizli katman sayısı
  5. Öğrenme oranı

Bu örnekte, gizli katmanında bir gizli katman ve 5 nöron bulunan bir MLP Sinir Ağı kullanılmıştır. Her düğüm aktivasyon fonksiyonu olarak sigmoid fonksiyonunu kullanılmıştır: 

sigmoid(x)= 1/1+e^-x

Bu örneğe ait kayıp fonksiyonu ise aşağıdaki gibidir;

(X(t), y(t)), eğitimin girişleridir. Sinir ağının temel amacı W, V, b, c parametrelerini güncelleyerek bu maliyet fonksiyonunu en aza indirmektir. Son olarak, bu örnekteki klasik eğitim prosedürü, W, V, b, c parametrelerini tekrarlayan şekilde gradyan bir şekilde azalarak şu şekilde günceller:

KODLARIN OLUŞTURULMASI

Önerilen sinir ağını eğitmek için bazı verilere ihtiyaç vardır. Örneğin, burada [0, 2π] aralığını parçalara bölüp ve bir eğitim seti olarak sinir ağına verilmiştir.

 

#define Train_Set_Size 20

#define PI 3.141592653589793238463

...

vector<pair<double, double>> trainSet;

trainSet.resize(Train_Set_Size);

 

for (int i = 0; i < Train_Set_Size; i++) {

         trainSet[i] = make_pair(i * 2 * PI / Train_Set_Size, sin(i * 2 * PI / Train_Set_Size));

}...

 

 

Sigmoid işlevi bir C ++ standart fonksiyonu olmadığından sigmoid'i hesaplamak için bir fonksiyon tanımlanmıştır.

...

double sigmoid(double x) {        

return (1.0f / (1.0f + std::exp(-x)));

}...

 

Ayrıca, her iterasyonda y ^) (=) (fθ (x) değerini hesaplamak için bir fonksiyon gerekmektedir:

...

double f_theta(double x) {        

double result = b;        

for (int i = 0; i < N; i++) {                

result += V[i] * sigmoid(c[i] + W[i] * x);        

}        

return result; } ...

 

X 1 × 1 eğitimin giriş değeri, W 1 × 1 ağırlık vektörü ve c her nöronun ofseti için ölçekleyici değeridir, ancak tüm düğümlerin ofset değerini basitlik için 1 × 5 dizide saklarız. Son olarak b ise çıkış düğümleri ofset değeridir. Bu değişkenleri kodumuzun başında şu şekilde tanımlanmıştır:

#define N 5

...double c[N] = {};

double W[N] = {};

double V[N] = {};

double b = 0;

...

 

#define N 5...double c[N] = {};double W[N] = {};double V[N] = {};double b = 0;...

 

...

for (int i = 0; i < N; i++) {        

W[i] = W[i] - epsilon * 2 * (f_theta(x) - y) * V[i] * x *     

(1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);

}...

 

Geri kalan parametreleri aşağıdaki gibi hesaplayabiliriz:

...

for (int i = 0; i < N; i++) {        

V[i] = V[i] - epsilon * (f_theta(x) - y) * sigmoid(c[i] + W[i] * x);

}...

...

b = b - epsilon * (f_theta(x) - y);

...

...

for (int i = 0; i < N; i++) {        

c[i] = c[i] - epsilon * (f_theta(x) - y) * V[i] *     

(1 - sigmoid(c[i] + W[i] * x)) * sigmoid(c[i] + W[i] * x);

}...

Şimdi her eğitim verisi için sinir ağı parametrelerini güncellemeliyiz, ancak çoğu zaman iyi bir sonuç elde etmek için tüm eğitim çiftlerini sinir ağına birkaç kez vermeliyiz. Sinir ağına "Epoch" adı verilen tüm eğitim verilerini her verdiğimizde:

...

for (int j = 0; j > epoch; j++) {        

for (int i = 0; i < Train_Set_Size; i++) {                

train(trainSet[i].first, trainSet[i].second);        

}        

std::cout << j << "\r";

}...

Son olarak, sonuçları çizmek için GNUplot kullandığımızda uygulama için yazılan C++ kodunun tamamı aşağıdaki şekilde tamamlanmış olur:

 

Kaynak: https://www.codeproject.com/Articles/1237026/Simple-MLP-Backpropagation-Artificial-Neural-Netwo

NOT: Burada yaptığım paylaşımlar, yapay sinir ağlarını öğrenme, geliştirme aşamasında yaptığım çalışmalardır. Herhangi bir iddaası yoktur. Paylaşımlardaki birincil maksat: benim gibi öğrenme yolunda olanlara fikir vermek, bilime minik de olsa katkıda bulunmaktır. Anlayışınız ve ilginiz için teşekkür ederim. Ali Osman Gökcan ;-)

 

--->>>Matlab Optimtool Toolbox ile Genetik Algoritma Örneği için TIKLAYINIZ <<<---

 --->>>Matlab Fuzzy Logic Toolbox ile Tahmin Örneği için TIKLAYINIZ <<<---

 --->>>Matlab Nntool Toolbox ile Regresyon Örneği için TIKLAYINIZ <<<---

 --->>>C++ ile Makine Öğrenmesi KNN algoritması Örneği için TIKLAYINIZ <<<---

 'ysa, 'yapay sinir ağları', 'ysa ile denklem çözümü', 'Geri Yayılım Yöntemi', 'c++ ysa uygulamaları', 'yapay zeka', 'ysa uygulaması', 'artificial neual networks', 'ysa uygulamaları', 'yapay sinir ağı uygulamaları', 'Ali Osman Gökcan', 'Ali Osman Hoca', 'Ali Osman', 'ali osman matlab', 'ysa c++ örneği', 'c++ makine öğrenmesi', 'geri yayılım algoritması', 'c++ ile geri yayılım algoritması', 'geri yayılım algoritması örneği', 'örnek geri yayılım algoritması', 'back propagation algorithm', 'back propagation algorithm example', 'back propagation c++ example'