Zad 1.
Sformować obrazy cyfr 0 do 9.
Sformułować zadanie rozpoznawania cyfr na podstawie odpowiednich wektorów.
Wybrać strukturę sieci neuronowej dla rozpoznawania cyfr — sieć jednokierunkowa z wsteczną propagacją błędów.
Przygotować w systemie MATLAB z wykorzystaniem Neural Network Toolbox program dla rozpoznawania cyfr przy odpowiedniej sieci neuronowej.
Zrealizować uczenie sieci neuronowej na testowych wektorach dla cyfr.
Rozpoznać z wykorzystaniem napisanego programu sygnałów dla cyfr przy zakłóceniach tych sygnałów.
W programie PAINT na obszarze 8x12 pikseli narysowano cyfry od 0 do 9.
Rys. 1 Obrazy cyfr
Następnie musimy załadować obrazy do workspace programu Matlab. Za pomocą funkcji Matlaba zamienimy macierz 8x12 na wektor o długości 96 elementów. Obrazy były zapisane, jako mapy 256 bitowe (.bmp), więc należy, zbinaryzować wektory.
Listing:
zero_pokaz=imread (' 0.bmp') ; jeden_pokaz=imread('1.bmp');
…
zero=(reshape(zeroj_pokaz',1,[ ]))' jeden=(reshape(jeden_pokaz',1,[ ]))'
…
zero=double(zero); jeden=double(jeden);
…
for i=1:96
if zero(i)==255 zero(i)=1;
end
if jeden(i)==255 jeden(i)=1;
end
…
end
Tak przygotowane wektory (pionowe) wpisujemy do macierzy, gdzie poszczególna kolumna to kolejna cyfra.
x=[ zero, jeden, dwa, trzy, cztery, piec, szesc, siedem, osiem, dziewiec];
Tworzymy macierz diagonalną.
y=eye(10,10);
Teraz możemy stworzyć sieć neuronową i wykonać jej trenowanie.
net=newff (x,y, [20 5], ('Iogsig','logsig'),'traincgp); net=train(net,x,y);
Neural Network
Funkcja trenowania otwiera okno jak na rysunku obok, które pokazuje nam podstawowe informacje o wykonanej operacji, ilość iteracji, czas trenowania i inne. Możemy także zobaczyć wykresy Performance, Training State oraz Regression, dzięki którym możemy uzyskać więcej informacji na temat trenowania.
Funkcja sim wykonuje symulację i wynikiem symulacji jest macierz Z.
z=sim (net , x)
Jak widać wyniki są zakłamane, nie mamy jednoznacznej odpowiedzi. Możliwe jest że poszczególne cyfry są zbyt podobne do siebie i wykorzystana ilość neuronów i warstw ukrytych Jest nieodpowiednia i nie zapewnia dobrego wyniku. Ma tu także znaczenie użycie odpowiedniej metody trenowania.
W celu sprawdzenia czy na pewno program został poprawnie napisany, przetestujemy ten program dla 3 cyfr.
y1=eye (3, 3) ;
x1=[zero jeden dwa];
net=newff (x1,y1, [20 5], ('logsig','logsig'),'traingcgp');
net=train (net, x1, y1) ;
z=sim(net,x1)
z =|
1.0000 -0.0000 -0.0000
-0.0000 1.0000 0.0000
-0.0000 -0.0000 1.0000
Widać teraz wyraźnie, że pierwszy element jest podobny do zera, drugi do jedynki, a trzeci do cyfry dwa. Program działa poprawnie.
z =
Zad 2.
Wykonać to samo zadanie przy wykorzystaniu rekurencyjnej sieci Hopfielda.
Programowanie sieci Hopfielda różni się od programu w poprzednim zadaniu. Funkcja tworzenia sieci od razu trenuje tą sieć. Na potrzeby zadania zepsuliśmy wektor cyfry 0, i daliśmy ją jako wejście do sieci Hopfielda, a w wyniku powinna doprowadzić zepsuty wektor do najbliższego wektora i odtworzyć cyfrę.
Listing:
x=[ zero, jeden, dwa, trzy, cztery, piec, szesc, siedem, osiem, dziewięć];
nethop=newhop(x);
%Tworzenie wektora cyfry zero z zakłóceniami
zero zepsute_zero;
for i=1:24
zero_zepsute(i)=0;
end
for i=56:70
zero_zepsute(i)=1;
end
zero_zepsute_pokaz=reshape (zero_zepsute, 8, 12)';
figure(1)
imshow(zero_zepsute_pokaz);
[Yhop, Pfhop,Afhop] = sim(nethop, [ ],[ ], zero_zepsute);
Yhop_pokaz=reshape(Yhop,8,12) ';
figure(2)
imshow(Yhop_pokaz)
Ponieważ ciężko jest określić wynik sieci na podstawie wektorów, zamieniono go na macierz
o wymiarze 8x12 i za pomocą funkcji imshow pokazano wynik.
Rys 3 Obraz cyfry zero z zakłóceniami
Obraz jak na rysunku 3, dano Jako sygnał wejściowy do sieci Hopfielda. Wektorem, który sieć zwróciła jest Yhop. Z powodu trudności w porównaniu wyników zilustrowano go także za pomocą funkcji imshow.
Jak widać na rysunku 4, sieć Hopfielda przybliżyła wektor z zakłóceniami do wektora cyfry 0. Odwzorowanie cyfry nie jest Idealne, ale wyraźnie widać że to cyfra 0. Co oznacza że algorytm działa poprawnie.
Rys. 4 Obraz cyfry zwrócony przez sieć Hopfielda
Zad 3.
Dla wybranej funkcji jednej zmiennej zrealizować jej prognozowanie przy pomocy jednokierunkowej sieci neuronowej z wsteczną propagacją błędów.
W tym zadaniu nauczymy sieć neuronową, funkcji sinus, a następnie wpisując tylko argumenty do sieci, będzie ona musiała odwzorować naszą funkcje.
Listing:
rng(’default')
funx=-1:.2:10; funy=2*sin(funx);
figure(1)
plot(funx,funy);
hold on
net_zad3=newff(funx, funy, [20 5], {' tansig', ' tansig'}. 'traincgp'); net_zad3=train (net_zad3, funx, funy);
funy_apro=sim (net_zad3, funx) ;
plot(funx,funy_apro);
hold off
Brak komendy rng('default') sprawi, że sieć za każdym razem da nam inny wynik, przy tych samych ustawieniach sieci, co nie pozwala na odpowiednie dobranie dla niej parametrów. Na wykresie przedstawiono funkcje podstawową oraz funkcje uzyskaną z sieci neuronowej.
Widać, że odwzorowanie nie jest idealne, i w zasadzie mocno odbiega od funkcji podstawowej. Aby ulepszyć odwzorowania należałoby sprawdzić różne metody uczenia, zmienić ilość warstw ukrytych i szukać najlepszego wyniku.
Dla wybranej funkcji jednej zmiennej zrealizować jej prognozowanie przy pomocy sieci neuronowej.
Listing:
x4=0:0.1:9; y4=(x4-5).^2; figure(1) plot(x4,y4) hold on dl=length(y4) ;
net4=newff (x4,y4, [30] , { 'tansig'} , ' trainbfg') ; net4=train (net4 , y4 (1 :d1-1) ,y4 (2:dl)) ;
y4_new=sim(net4,y4(dl) )
plot (9, y4_new,'*', ’MarkerEdgeColor', 'r');
hold off
Zad 4.
Rys. 6 Parabola oraz prognoza kolejnej wartości
Wpisując ostatnią wartość funkcji y(dl) sieć prognozuje kolejną wartość. Która jest oznaczona gwiazdką na wykresie powyżej.