Politechnika Radomska |
||||
Wydział: Nauczycielski |
Kierunek: Informatyka |
Grupa: L3 |
||
Przedmiot: Techniczne zastosowanie sieci neuronowych. |
||||
Temat: 1-7
|
Prowadzący: Mgr A. Hermanowicz |
|||
Wykonała: Tuszyńska Katarzyna |
Data: 27.03.2008 |
Ocena: |
Cel:
Celem zadania jest skonstruowanie sieci neuronowej MLP [1] bez uczenia o strukturze 2x5x3x1 (Rysunek nr 1). Sprawdzenie odpowiedzi sieci i jej granic decyzyjnych. Przeprowadzenie testów dla dwóch różnych funkcji aktywacji:
f(x) =
(1)
f(x) =
(2)
Struktura sieci:
Rys. 1. Struktura sieci 2x5x3x1
Funkcje aktywacji:
Funkcje aktywacji podane są w punkcie 1. (Równania (1) i (2)).
Opis programu:
Rysunek nr 2 przedstawia interfejs graficzny programu. Dane do programu można wprowadzać na dwa sposoby:
Ręcznie po przez wciśnięcie przycisku „Wprowadź dane”, wtedy pojawia się okno służące do wprowadzania danych - Rys. 3.
Automatycznie po przez wciśnięcie przycisku „Wagi losowe”.
W miejsce myślników po wciśnięciu przycisku „Wagi losowe” ukażą się losowe wagi.
Rys. 2. Interfejs graficzny programu
Rys. 3. Okno pojawiające się po wciśnięciu przycisku „Wprowadź dane”
Rys. 4. Wynik programu dla pierwszej z funkcji aktywacji przy podanych wagach
Rys. 5. Wynik programu dla drugiej z funkcji aktywacji przy podanych wagach
Rys. 4 i Rys. 5 przedstawiają wynik programu dla tych samych danych, ale przy zastosowaniu dwóch różnych funkcji aktywacji.
Kod źródłowy:
public double f1(double n)
{
double w;
w=1/(2+Math.Exp(-n));
return w;
}
public double f2(double n)
{
double w;
w = (1 - Math.Exp(-n)) / (1 + Math.Exp(-n));
return w;
}
public double wy(double[] wej, double[] wa)
{
wyne = 0;
for (int i = 0; i <= wa.Length - 2; i++)
{
wyne = wyne + wa[i] * wej[i];
}
wyne = wyne + wa[wa.Length - 1];
return wyne;
}
public void wątek1()
{
int x;
int y;
double[] wej = new double[2];
double[] wej2 = new double[5];
double[] wej3 = new double[3];
double ks = 0;
Random los = new Random();
while (true)
{
x = los.Next(-100, 100);
wej[0] = x;
y = los.Next(-100, 100);
wej[1] = y;
if (radioButton1.Checked == true)
{
double ne1 = n.wy(wej, wa1);
wej2[0] = n.f1(ne1);
double ne2 = n.wy(wej, wa2);
wej2[1] = n.f1(ne2);
double ne3 = n.wy(wej, wa3);
wej2[2] = n.f1(ne3);
double ne4 = n.wy(wej, wa4);
wej2[3] = n.f1(ne4);
double ne5 = n.wy(wej, wa5);
wej2[4] = n.f1(ne5);
double ne6 = n.wy(wej2, wa6);
wej3[0] = n.f1(ne6);
double ne7 = n.wy(wej2, wa7);
wej3[1] = n.f1(ne7);
double ne8 = n.wy(wej2, wa8);
wej3[2] = n.f1(ne8);
double ne9 = n.wy(wej3, wa9);
ks = n.f1(ne9);
Graphics g = Graphics.FromImage(bmp);
Brush gr = new SolidBrush(Color.Green);
Pen z = new Pen(Color.Green, 1.0f);
Brush re = new SolidBrush(Color.Red);
Pen r = new Pen(Color.Red, 1.0f);
Brush bl = new SolidBrush(Color.Blue);
Pen b = new Pen(Color.Blue, 1.0f);
if (ks >0)
{
g.DrawEllipse(z, x + 100, 100 - y, 3, 3);
g.FillEllipse(gr, x + 100, 100 - y, 3, 3);
}
else if (ks < 0)
{
g.DrawEllipse(r, x + 100, 100 - y, 3, 3);
g.FillEllipse(re, x + 100, 100 - y, 3, 3);
}
else
{
g.DrawEllipse(b, x + 100, 100 - y, 3, 3);
g.FillEllipse(bl, x + 100, 100 - y, 3, 3);
}
pictureBox1.Image = bmp;
pictureBox1.Invalidate();
g.Dispose();
}
if (radioButton2.Checked == true)
{
double ne1 = n.wy(wej, wa1);
wej2[0] = n.f2(ne1);
double ne2 = n.wy(wej, wa2);
wej2[1] = n.f2(ne2);
double ne3 = n.wy(wej, wa3);
wej2[2] = n.f2(ne3);
double ne4 = n.wy(wej, wa4);
wej2[3] = n.f2(ne4);
double ne5 = n.wy(wej, wa5);
wej2[4] = n.f2(ne5);
double ne6 = n.wy(wej2, wa6);
wej3[0] = n.f2(ne6);
double ne7 = n.wy(wej2, wa7);
wej3[1] = n.f2(ne7);
double ne8 = n.wy(wej2, wa8);
wej3[2] = n.f2(ne8);
double ne9 = n.wy(wej3, wa9);
ks = n.f2(ne9);
Graphics g = Graphics.FromImage(bmp);
Brush gr = new SolidBrush(Color.Green);
Pen z = new Pen(Color.Green, 1.0f);
Brush re = new SolidBrush(Color.Red);
Pen r = new Pen(Color.Red, 1.0f);
Brush bl = new SolidBrush(Color.Blue);
Pen b = new Pen(Color.Blue, 1.0f);
if (ks > 0)
{
g.DrawEllipse(z, x + 100, 100 - y, 3, 3);
g.FillEllipse(gr, x + 100, 100 - y, 3, 3);
}
else if (ks < 0)
{
g.DrawEllipse(r, x + 100, 100 - y, 3, 3);
g.FillEllipse(re, x + 100, 100 - y, 3, 3);
}
else
{
g.DrawEllipse(b, x + 100, 100 - y, 3, 3);
g.FillEllipse(bl, x + 100, 100 - y, 3, 3);
}
pictureBox1.Image = bmp;
pictureBox1.Invalidate();
g.Dispose(); }
Thread.Sleep(100);
}
}
Dane:
Dane wejściowe to wektory dwuwymiarowe, każda składowa wektora wejściowego zawiera się w przedziale od -1 do 1.
Wnioski:
Zmiana wag powoduje zmianę odpowiedzi sieci.
Nie zawsze dla tych samych wag przy zastosowaniu różnych funkcji aktywacji odpowiedź sieci jest taka sama. (Rys. 4. i rys. 5.)
Bibliografia:
Masters T. Sieci neuronowe w praktyce, WNT, Warszawa 1996.