Narzędzia sztucznej inteligencji - laboratorium |
Adam Czech Gabriel Kachel |
rok III INF I st., gr. L6 środa, godz. 14:40 |
Ćwiczenie 3: Rekurencyjna sieć Hopfielda jako pamięć skojarzeniowa - rekonstrukcja wzorców znakowych |
||
Ćwiczenie wykonano w dniach: 28.05, 04.06.2014 |
Sprawozdanie oddano dnia: 10.06.2014 |
ocena: |
1. Cel i zakres ćwiczenia.
Ćwiczenia ma na celu zastosowanie rekurencyjnej sieci Hopfielda do usuwania zakłóceń z map bitowych, zawierających obraz liter „E”, „F”, „G”, „H”. Działanie sieci umożliwia rekonstrukcję zniekształconego obrazu, poprzez skojarzenie go z oryginalnym wzorcem, pełniącym rolę tzw. Atraktora, czyli punktu stabilnego sieci.
2. Wstęp teoretyczny
Jednym z najpopularniejszych typów sieci rekurencyjnych jest sieć Hopfielda. Podstawowe cechy tej sieci:
- struktura jednowarstwowa, ze sprzężeniem zwrotnym,
- nieliniowa funkcja aktywacji neuronów,
- brak wejść zewnętrznych,
- do wejść neuronów podawane są sygnały wyjściowe wszystkich pozostałych neuronów, opóźnione o jedną chwilę czasową.
Rys. 1. Struktura sieci rekurencyjnej Hopfielda [1]
Parametry sieci Hopfielda:
macierz współczynników wagowych W o wymiarach N x N (N - liczba neuronów)
|
|
niekiedy uwzględnia się również N-elementowy wektor współczynników progowych b:
|
|
potencjał i-tego neuronu w k-tym kroku działania sieci:
|
|
funkcja aktywacji - najczęściej progowa , progowa symetryczna lub liniowa z nasyceniem :
|
|
|
|
|
|
Z siecią Hopfielda związana jest ponadto tzw. funkcja energetyczna, przyjmująca w kolejnym, k-tym kroku działania sieci następującą wartość: [1]
|
|
gdzie y(k) jest wektorem wartości sygnałów wyjściowych sieci w k-tym kroku: [1]
|
|
3. Przygotowanie danych i utworzenie sieci Hopfielda
Na samym początku ćwiczenia zdefiniowaliśmy cztery macierze o wymiarach 6x8, reprezentujące mapy bitowe naszych liter. Macierze wypełnialiśmy „1” dla zapalonego piksela lub „-1” dla zgaszonego.
A=[-1,-1,-1,-1,-1,-1, -1,1,1,1,1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1, -1,1,1,1,1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1, -1,1,1,1,1,-1]
B=[-1,-1,-1,-1,-1,-1, -1,1,1,1,1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1, -1,1,1,1,1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1]
C=[-1,-1,-1,-1,-1,-1, -1,-1,1,1,1,1, -1,1,-1,-1,-1,-1, -1,1,-1,-1,-1,-1, -1,1,-1,1,1,1, -1,1,-1,-1,-1,1, -1,1,-1,-1,-1,1, -1,-1,1,1,1,1] D=[-1,-1,-1,-1,-1,-1, -1,1,-1,-1,1,-1, -1,1,-1,-1,1,-1, -1,1,-1,-1,1,-1, -1,1,1,1,1,-1, -1,1,-1,-1,1,-1, -1,1,-1,-1,1,-1, -1,1,-1,-1,1,-1] |
|
Kolejnym krokiem była wizualizacja naszych liter, by to przeprowadzić użyliśmy funkcję subplot oraz hintonw, by móc wyświetlić wszystkie litery w jednym oknie graficzny
figure(1)
subplot(2,2,1)
hintonw(A);
subplot(2,2,2)
hintonw(B);
subplot(2,2,3)
hintonw(C);
subplot(2,2,4)
hintonw(D);
Otrzymaliśmy następujące obrazy:
Rys. 2. Wizualizacja znaków wzorcowych.
Kolejnym etapem ćwiczenia było utworzenie macierzy atraktorów T. By to wykonać musieliśmy przekształcić macierze wejściowe obrazów na macierz o rozmiarze 48x1, zrobiliśmy to za pomocą funkcji reshape. Nowo powstała macierz T ma rozmiar 48x4, gdyż w kolejnych kolumnach znajdują się poszczególne atraktory.
A1=reshape(A,48,1);
B1=reshape(B,48,1);
C1=reshape(C,48,1);
D1=reshape(D,48,1);
T=[A1,B1,C1,D1]
Po sprawdzeniu poprawności macierzy T, wykorzystując funkcję newhop utworzyliśmy sieć Hopfielda, dla której atraktorami są znaki wzorcowe:
net = newhop(T)
Kolejną czynnością było dopisanie do skryptu instrukcji, które wyświetlały rozmiary i zawartość macierzy współczynników wagowych oraz wektora współczynników progowych:
disp('Rozmiar macierzy wag: ' )
disp(net.LW)
disp('Zawartość macierzy wag: ')
disp(net.LW{1})
disp('Rozmiar wektora wsp. progowych: ')
disp(net.b)
disp('Zawartość wektora wsp. progowych: ')
disp(net.b{1})
4. Badanie właściwości skojarzeniowych utworzonej sieci Hopfielda
By przetestować naszą sieć Hopfielda, sprawdziliśmy, czy sieć potrawi odtworzyć oryginalne obrazy liter na podstawie ich zakłóconych obrazów. W tym celu utworzyliśmy macierz TZ.
A2=[-1,-1,-1,-1,-1,-1,
-1,-1,1,1,1,-1,
-1,-1,-1,1,-1,-1,
-1,1,1,1,-1,-1,
-1,1,1,1,1,-1,
-1,1,1,1,-1,-1,
-1,1,-1,-1,-1,-1,
-1,1,1,1,1,-1]
B2=[-1,-1,1,-1,-1,-1,
-1,1,-1,-1,1,-1,
-1,1,-1,-1,-1,-1,
-1,1,-1,1,-1,-1,
-1,1,1,1,1,-1,
-1,1,1,-1,-1,1,
-1,1,-1,-1,-1,-1,
-1,1,-1,-1,-1,-1]
C2=[-1,-1,-1,-1,-1,-1,
-1,-1,1,1,1,1,
-1,1,-1,-1,-1,-1,
-1,1,-1,1,-1,1,
-1,1,-1,1,1,1,
-1,1,1,-1,-1,1,
-1,1,-1,1,-1,1,
-1,-1,1,1,1,1]
D2=[-1,-1,1,-1,-1,-1,
-1,1,-1,-1,1,-1,
-1,1,-1,-1,1,-1,
-1,1,-1,-1,1,-1,
-1,1,1,1,1,-1,
-1,1,-1,1,1,-1,
-1,1,-1,-1,1,-1,
-1,1,-1,-1,1,-1]
figure(2)
subplot(2,2,1)
hintonw(A2);
subplot(2,2,2)
hintonw(B2);
subplot(2,2,3)
hintonw(C2);
subplot(2,2,4)
hintonw(D2);
A3=reshape(A2,48,1);
B3=reshape(B2,48,1);
C3=reshape(C2,48,1);
D3=reshape(D2,48,1);
TZ=[A3,B3,C3,D3]]
Następnie zasymulowaliśmy działanie sieci Hopfielda, podając jako warunki początkowe stany reprezentujące zakłócone obrazy:
Y=sim(net,{4 5}, {}, {TZ})
Gdzie:
Net - jest zmienną reprezentującą utworzono uprzednio sieć,
Pierwsza zmienna to LS, która reprezentuje liczbę różnych stanów początkowych, dla których chcemy przeprowadzić symulację, w naszym przypadku jest to 4, gdyż mamy 4 literki
Druga zmienna to KS, czyli liczba kroków czasowych symulacji w naszym przypadku 5.
W wyniku funkcji sim otrzymujemy zmienną Y, która jest tablicą macierzy. W naszym przypadku składa się ona z 5 macierzy, gdyż tyle kroków działania sieci symulujemy (KS=5). W kolejnym kroku wyświetliliśmy macierze wchodzące w skład tablicy Y:
whos Y
disp(Y)
disp(Y{1})
disp(Y{2})
disp(Y{3})
disp(Y{4})
disp(Y{5})
Następnie przeprowadziliśmy wizualizację stanów sieci w kolejnych krokach jej działania.
figure(2)
for i=1:4
subplot(2,2,i)
hintonw(reshape(TZ(:,i),8,6))
end
pause
for j=1:5
for k=1:4
subplot(2,2,k)
Z=reshape(Y{j}(:,k),8,6)
hintonw(Z)
end
pause
end
Wizualizacja obrazów z kolejno, 1, 3 i wieloma zakłóceniami
Rys. 3. Wizualizacja znaków z jednym zakłóceniem.
Rys. 4. Wizualizacja znaków z trzema zakłóceniami.
Rys. 5. Wizualizacja znaków z wieloma zakłóceniami.
Rys. 6. Wizualizacja rekonstrukcji znaków z jednym zakłóceniem
Rys. 7. Wizualizacja rekonstrukcji znaków z trzema zakłóceniami
Rys. 8. Wizualizacja rekonstrukcji znaków z wieloma zakłóceniami - krok 1
Rys. 9. . Wizualizacja rekonstrukcji znaków z wieloma zakłóceniami - krok 2
Rys. 10. Wizualizacja rekonstrukcji znaków z wieloma zakłóceniami - krok 3
Rys. 11. Wizualizacja rekonstrukcji znaków z wieloma zakłóceniami - krok 4
Rys. 12. Wizualizacja rekonstrukcji znaków z wieloma zakłóceniami - krok 5
6.Wnioski
W ćwiczeniu zapoznaliśmy się z rekurencyjną siecią Hopfielda i zastosowaliśmy sieć do usuwania zakłóceń z map bitowych o wymiarach 8x6 pikseli, zawierających obrazy liter E, F, G i H.
Przygotowanie map bitowych oraz tworzenie sieci Hopfielda odbyło się bez większych trudności.
Następnym etapem naszej pracy było sprawdzenie możliwości skojarzeniowych naszej utworzonej wcześniej sieci, aby tego dokonać wprowadziliśmy początkowo tylko jedno zakłócenie (Rys. 3.), sieć odpowiedziała zgodnie z założeniem ćwiczenia czyli prawidłowo skojarzyła mapę bitową pomimo zakłócenia (Rys. 6.). Następnie zwiększaliśmy ilość zakłóceń mapy bitowej do 3 (Rys. 4.), sieć nadal prawidłowo kojarzyła litery (Rys.7.). Po wprowadzenia do wzorca mapy bitowej większej ilości błędów (Rys. 5.), postanowiliśmy przedstawić proces kojarzenia liter przez sieć (Rys. 8, 9, 10, 11, 12.), jak widać sieć nadal poprawnie odczytywała zakłócone litery i potrafiła je zrekonstruować.
Naszym zdaniem sieć Hopfielda, którą stworzyliśmy zgodnie z poleceniami ze skryptu, działa poprawnie, a jej możliwości są naprawdę duże.
Wykaz literatury
1.Bartecki K.: Sztuczne sieci neuronowe w zastosowaniach. Zbiór ćwiczeń laboratoryjnych z wykorzystaniem przybornika Neural Network Toolbox programu Matlab. Skrypt Politechniki Opolskiej nr 289, Opole 2010.
2.Bartecki K.: Sztuczne sieci neuronowe. Materiały do wykładów z sieci neuronowych.
10