Exemplo n.º 1
0
        public void eğit()
        {
            kur(eğitimVerisi[0]);

            for (int i = 0; i < epoch; i++)
            {
                hesapla(index);
                ağırlıkGüncelle(index);

                for (int x = 0; x < gizliNöronArr.Length; x++)
                {
                    for (int jx = 0; jx < gizliNöronArr[x].ÇıkanSinapslar.Count; jx++)
                    {
                        Sinaps sinaps = gizliNöronArr[x].ÇıkanSinapslar[jx];
                        if (sinaps.ÇıktıNöron == o1)
                        {
                            GeriYayılım.GizliKatmanSinapsGüncelle(sinaps, beklenenDegerler[index][0], o1.Çıkış, o1.Çıkış, sinaps.GirdiNöron.Çıkış);
                        }
                        if (sinaps.ÇıktıNöron == o2)
                        {
                            GeriYayılım.GizliKatmanSinapsGüncelle(sinaps, beklenenDegerler[index][1], o2.Çıkış, o2.Çıkış, sinaps.GirdiNöron.Çıkış);
                        }
                        if (sinaps.ÇıktıNöron == o3)
                        {
                            GeriYayılım.GizliKatmanSinapsGüncelle(sinaps, beklenenDegerler[index][2], o3.Çıkış, o3.Çıkış, sinaps.GirdiNöron.Çıkış);
                        }
                        if (sinaps.ÇıktıNöron == o4)
                        {
                            GeriYayılım.GizliKatmanSinapsGüncelle(sinaps, beklenenDegerler[index][3], o4.Çıkış, o4.Çıkış, sinaps.GirdiNöron.Çıkış);
                        }
                        if (sinaps.ÇıktıNöron == o5)
                        {
                            GeriYayılım.GizliKatmanSinapsGüncelle(sinaps, beklenenDegerler[index][4], o5.Çıkış, o5.Çıkış, sinaps.GirdiNöron.Çıkış);
                        }
                    }
                }
                index++;
                if (index == 5)
                {
                    index = 0;
                }
            }



            girisMatrisDegiştir(eğitimVerisi[0]);
            hesapla(0);

            MessageBox.Show(o1.Çıkış + "\n" + o2.Çıkış + "\n" + o3.Çıkış + "\n" + o4.Çıkış + "\n" + o5.Çıkış);
        }
 public void çıkanSinapsEkle(Sinaps sinaps)
 {
     this.ÇıkanSinapslar.Add(sinaps);
 }
        public static void GizliKatmanSinapsGüncelle(Sinaps sinaps, double hedef, double gelen, double oxÇıkış, double hxÇıkış)
        {
            double x = (gelen - hedef) * Fonksiyonlar.sigmoid_türev(oxÇıkış) * hxÇıkış;

            sinaps.Ağırlık = sinaps.Ağırlık - 0.5 * x;
        }
 public void girenSinapsEkle(Sinaps sinaps)
 {
     this.GirenSinapslar.Add(sinaps);
 }
        public static void girisKatmanSinapsGüncelle(Sinaps sinaps,
                                                     double o1hedef, double o1gelen,
                                                     double o2hedef, double o2gelen,
                                                     double o3hedef, double o3gelen,
                                                     double o4hedef, double o4gelen,
                                                     double o5hedef, double o5gelen,
                                                     Nöron o1, Nöron o2, Nöron o3, Nöron o4, Nöron o5)
        {
            //o1 hata hesaplama
            double eox = 0.0;

            sinaps.ÇıktıNöron.ÇıkanSinapslar.ForEach(sin =>
            {
                if (sin.ÇıktıNöron == o1)
                {
                    eox = sin.Ağırlık;
                }
            });
            double türev = Fonksiyonlar.sigmoid_türev(o1.Çıkış);
            double hata1 = o1.YanlışlıkMiktarı * türev;

            hata1 *= eox;

            //o2 hata

            double eox2 = 0.0;

            sinaps.ÇıktıNöron.ÇıkanSinapslar.ForEach(sin =>
            {
                if (sin.ÇıktıNöron == o2)
                {
                    eox2 = sin.Ağırlık;
                }
            });
            double türev2 = Fonksiyonlar.sigmoid_türev(o2.Çıkış);
            double hata2  = o2.YanlışlıkMiktarı * türev2 * eox2;



            //o3

            double eox3 = 0.0;

            sinaps.ÇıktıNöron.ÇıkanSinapslar.ForEach(sin =>
            {
                if (sin.ÇıktıNöron == o3)
                {
                    eox3 = sin.Ağırlık;
                }
            });
            double türev3 = Fonksiyonlar.sigmoid_türev(o3.Çıkış);
            double hata3  = o3.YanlışlıkMiktarı * türev3 * eox3;


            //04

            double eox4 = 0.0;

            sinaps.ÇıktıNöron.ÇıkanSinapslar.ForEach(sin =>
            {
                if (sin.ÇıktıNöron == o4)
                {
                    eox4 = sin.Ağırlık;
                    //      MessageBox.Show("Eox" + eox2);
                }
            });
            double türev4 = Fonksiyonlar.sigmoid_türev(o4.Çıkış);
            double hata4  = o4.YanlışlıkMiktarı * türev4 * eox4;


            //o5

            double eox5 = 0.0;

            sinaps.ÇıktıNöron.ÇıkanSinapslar.ForEach(sin =>
            {
                if (sin.ÇıktıNöron == o5)
                {
                    eox5 = sin.Ağırlık;
                    //      MessageBox.Show("Eox" + eox2);
                }
            });
            double türev5 = Fonksiyonlar.sigmoid_türev(o5.Çıkış);
            double hata5  = o5.YanlışlıkMiktarı * türev5 * eox5;



            //devam


            double toplamHata = hata1 + hata2 + hata3 + hata4 + hata5;

            double çıktıtürev = Fonksiyonlar.sigmoid_türev(sinaps.ÇıktıNöron.Çıkış);
            double girdi      = sinaps.GirdiNöron.Çıkış;

            double rx = toplamHata * çıktıtürev * girdi;

            sinaps.Ağırlık -= (0.5 * rx);
        }