Advertisement
Lauda

neural network feedforward backpropagation

Jun 19th, 2014
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.53 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace NeuronskeI
  7. {
  8.     public class BackPropagation
  9.     {
  10.         public static int MAXN = 8;
  11.         public static int SLOJEVI = 3;
  12.         public static int uzorciN = 256;
  13.         public static int MAXITERACIJA = 1000;
  14.         public static double MAXGRESKA = 0.001;
  15.         public static int BROJPOKUSAJA = 42;
  16.  
  17.         public TSloj[] slojevi = new TSloj[SLOJEVI];
  18.         public double[, ,] tezine = new double[SLOJEVI - 1, MAXN, MAXN];
  19.         public double[, ,] tezineP = new double[SLOJEVI - 1, MAXN, MAXN];
  20.         public double[, ,] obucavajuciSkup = new double[uzorciN, 2, MAXN];
  21.         public double ni;
  22.         public double beta;
  23.  
  24.         public BackPropagation()
  25.         {
  26.             inicijalizacija();
  27.         }
  28.  
  29.         protected void inicijalizacija()
  30.         {
  31.             for (int i = 0; i < SLOJEVI; i++)
  32.                 slojevi[i] = new TSloj();
  33.             ni = 0.05;
  34.             beta = 0.9;
  35.  
  36.             // TODO 5: postaviti brojeve neurona za svaki sloj
  37.             slojevi[0].n = 8;
  38.             slojevi[1].n = 8;
  39.             slojevi[2].n = 8;
  40.  
  41.             // TODO 6: napuniti obucavajuci skup
  42.  
  43.             int k = 0;
  44.          
  45.             for (int i = 0; i < 256; i++) {
  46.                 int[] x = int2bin8(i);
  47.                 int[] y = pomjeranje(x);
  48.  
  49.                 obucavajuciSkup[k, 0, 0] = x[0];
  50.                 obucavajuciSkup[k, 0, 1] = x[1];
  51.                 obucavajuciSkup[k, 0, 2] = x[2];
  52.                 obucavajuciSkup[k, 0, 3] = x[3];
  53.                 obucavajuciSkup[k, 0, 4] = x[4];
  54.                 obucavajuciSkup[k, 0, 5] = x[5];
  55.                 obucavajuciSkup[k, 0, 6] = x[6];
  56.                 obucavajuciSkup[k, 0, 7] = x[7];
  57.                 obucavajuciSkup[k, 1, 0] = y[0];
  58.                 obucavajuciSkup[k, 1, 1] = y[1];
  59.                 obucavajuciSkup[k, 1, 2] = y[2];
  60.                 obucavajuciSkup[k, 1, 3] = y[3];
  61.                 obucavajuciSkup[k, 1, 4] = y[4];
  62.                 obucavajuciSkup[k, 1, 5] = y[5];
  63.                 obucavajuciSkup[k, 1, 6] = y[6];
  64.                 obucavajuciSkup[k, 1, 7] = y[7];
  65.  
  66.                 k++;
  67.  
  68.             }
  69.            
  70.         }
  71.  
  72.         int[] pomjeranje(int [] niz){
  73.             bool najveciBit = false;
  74.             int[] ret= {0,0,0,0,0,0,0,0};
  75.             if (niz[0] == 1)
  76.             {
  77.                 ret[0] = 0;
  78.                 ret[7] = 1;
  79.             }
  80.            
  81.             for (int i = 7; i > 0; i--) {
  82.                 if (niz[i] == 1) {
  83.                     ret[i - 1] = 1;
  84.                 }
  85.             }
  86.  
  87.          
  88.             return ret;
  89.         }
  90.  
  91.         int[] int2bin8(int b)
  92.         {
  93.             int[] retVal = new int[8];
  94.             for (int i = 7; i >= 0; i--)
  95.             {
  96.                 int o = (int)b % 2;
  97.                 b = b / 2;
  98.                 retVal[i] = o;
  99.             }
  100.             return retVal;
  101.         }
  102.  
  103.         protected void inicijalizacijaTezina()
  104.         {
  105.             Random rnd = new Random();
  106.             for (int s = 0; s < SLOJEVI - 1; s++)
  107.                 for (int u = 0; u < slojevi[s].n; u++)
  108.                     for (int v = 0; v < slojevi[s + 1].n; v++)
  109.                     {
  110.                         tezine[s, u, v] = (float)(rnd.NextDouble() - 0.5) / 5;
  111.                         tezineP[s, u, v] = 0;
  112.                     }
  113.  
  114.             for (int s = 0; s < SLOJEVI; s++)
  115.                 for (int u = 0; u < MAXN; u++)
  116.                 {
  117.                     slojevi[s].bias[u] = 0;
  118.                     slojevi[s].biasp[u] = 0;
  119.                 }
  120.  
  121.             for (int s = 1; s < SLOJEVI - 1; s++)
  122.                 for (int u = 0; u < slojevi[s].n; u++)
  123.                     slojevi[s].bias[u] = (float)rnd.NextDouble();
  124.  
  125.         }
  126.  
  127.         double sigmoid(double net)
  128.         {
  129.             return 1 / (1 + Math.Exp(-net));
  130.         }
  131.  
  132.         public void izracunajIzlaz()
  133.         {
  134.             double net = 0.0;
  135.             for (int s = 1; s < SLOJEVI; s++)
  136.                 for (int v = 0; v < slojevi[s].n; v++)
  137.                 {
  138.                     net = slojevi[s].bias[v];
  139.                     for (int u = 0; u < slojevi[s - 1].n; u++)
  140.                         net += slojevi[s - 1].izlaz[u] * tezine[s - 1, u, v];
  141.                     slojevi[s].izlaz[v] = sigmoid(net);
  142.                 }
  143.         }
  144.  
  145.         void postaviUlaz(int uzorak)
  146.         {
  147.             for (int u = 0; u < slojevi[0].n; u++)
  148.                 slojevi[0].izlaz[u] = obucavajuciSkup[uzorak, 0, u];
  149.         }
  150.  
  151.         double izracunajGreske(int uzorak)
  152.         {
  153.             double greska = 0.0;
  154.             // greska u izlaznom sloju
  155.             for (int v = 0; v < slojevi[SLOJEVI - 1].n; v++)
  156.             {
  157.                 slojevi[SLOJEVI - 1].sigma[v] = obucavajuciSkup[uzorak, 1, v] - slojevi[SLOJEVI - 1].izlaz[v];
  158.                 greska += (slojevi[SLOJEVI - 1].sigma[v]) * (slojevi[SLOJEVI - 1].sigma[v]);
  159.             }
  160.             // greska u ostalim slojevima
  161.             for (int s = SLOJEVI - 2; s >= 0; s--)
  162.                 for (int u = 0; u < slojevi[s].n; u++)
  163.                 {
  164.                     double sigmaa = 0.0;
  165.                     for (int v = 0; v < slojevi[s + 1].n; v++)
  166.                         sigmaa += slojevi[s + 1].sigma[v] * tezine[s, u, v];
  167.                     double f = slojevi[s].izlaz[u];
  168.                     slojevi[s].sigma[u] = f * (1 - f) * sigmaa;
  169.                 }
  170.             return greska;
  171.         }
  172.  
  173.         void korigujTezine()
  174.         {
  175.             for (int s = 0; s < SLOJEVI - 1; s++)
  176.                 for (int v = 0; v < slojevi[s + 1].n; v++)
  177.                 {
  178.                     for (int u = 0; u < slojevi[s].n; u++)
  179.                     {
  180.                         tezineP[s, u, v] = ni * slojevi[s + 1].sigma[v] * slojevi[s].izlaz[u] + beta * tezineP[s, u, v];
  181.                         tezine[s, u, v] += tezineP[s, u, v];
  182.                     }
  183.                     slojevi[s + 1].biasp[v] = ni * slojevi[s + 1].sigma[v] +
  184.                                             beta * slojevi[s + 1].biasp[v];
  185.                     slojevi[s + 1].bias[v] += slojevi[s + 1].biasp[v];
  186.                     // izracunavanje korigovane vrednosti izlaza u sloju
  187.                     double net = slojevi[s + 1].bias[v];
  188.                     for (int u = 0; u < slojevi[s].n; u++)
  189.                         net += slojevi[s].izlaz[u] * tezine[s, u, v];
  190.                     slojevi[s + 1].izlaz[v] = sigmoid(net);
  191.                 }
  192.         }
  193.  
  194.         public double obucavanje()
  195.         {
  196.             double greska = 0;
  197.             for (int iteracija = 0; iteracija < MAXITERACIJA; iteracija++)
  198.             {
  199.                 greska = 0;
  200.                 for (int uzorak = 0; uzorak < uzorciN; uzorak++)
  201.                 {
  202.                     postaviUlaz(uzorak);
  203.                     izracunajIzlaz();
  204.                     greska += 0.5 * izracunajGreske(uzorak);
  205.                     korigujTezine();
  206.                 }
  207.                 Console.WriteLine("" + iteracija + " " + greska);
  208.                 if (greska < MAXGRESKA)
  209.                     break;
  210.             }
  211.             return greska;
  212.         }
  213.  
  214.         public double izlaz(double[] ulaz)
  215.         {
  216.             slojevi[0].izlaz[0] = ulaz[0];
  217.             slojevi[0].izlaz[1] = ulaz[1];
  218.             slojevi[0].izlaz[2] = ulaz[2];
  219.             slojevi[0].izlaz[3] = ulaz[3];
  220.             slojevi[0].izlaz[4] = ulaz[4];
  221.             slojevi[0].izlaz[5] = ulaz[5];
  222.             slojevi[0].izlaz[6] = ulaz[6];
  223.             slojevi[0].izlaz[7] = ulaz[7];
  224.             izracunajIzlaz();
  225.  
  226.             double ret = 0;
  227.             int j = 0;
  228.             for (int i = 7; i >= 0; i--)
  229.             {
  230.                 ret += Math.Round(slojevi[SLOJEVI - 1].izlaz[i]) * Math.Pow(2, j);
  231.                 j++;
  232.             }
  233.  
  234.             return ret;
  235.         }
  236.  
  237.         public void obuci()
  238.         {
  239.             inicijalizacija();
  240.             for (int pokusaj = 0; pokusaj < BROJPOKUSAJA; pokusaj++)
  241.             {
  242.                 inicijalizacijaTezina();
  243.                 double greska = obucavanje();
  244.                 if (greska < MAXGRESKA)
  245.                     break;
  246.             }
  247.         }
  248.     }
  249.  
  250.     public class TSloj
  251.     {
  252.  
  253.         public int n;
  254.         public double[] izlaz = new double[BackPropagation.MAXN];
  255.         public double[] sigma = new double[BackPropagation.MAXN];
  256.         public double[] bias = new double[BackPropagation.MAXN];
  257.         public double[] biasp = new double[BackPropagation.MAXN];
  258.  
  259.     }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement