sieci dwuwarstwowe
w MATLABie
LABORKA © Piotr Ciskowski
•
trzy funkcje do obsługi sieci dwuwarstwowej…:
–
init2.m
- tworzy sieć, inicjuje wagi
(losowo)
–
dzialaj2.m
– symuluje działanie sieci
(na pojedynczym przykładzie)
–
ucz2.m
- uczy sieć na zadanym ciągu uczącym
•
…i jeden skrypt:
–
test2.m
- sieć 2-2-1, przykład: XOR
•
init2.m
- tworzy sieć, czyli macierz wag obu warstw
i wypełnia je wartościami losowymi z zakresu -0.1 ÷ 0.1
- w sieciach jednowarstwowych
korzystamy
z wejścia zerowego – biasu
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
% funkcja tworzy sieć dwuwarstwową
% i wypełnia jej macierze wag wartościami losowymi
% z zakresu od -0.1 do 0.1
% parametry: S – liczba wejść do sieci / liczba wejść warstwy 1
% K1 – liczba neuronów w warstwie 1
% K2 – liczba neuronów w warstwie 2 / liczba wyjść sieci
% wynik: W1 – macierz wag warstwy 1 sieci
% W2 – macierz wag warstwy 2 sieci
W1 = ...
W2 = ...
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
( )
1
1 1
S + ×
X
( )
1
1
1
S
K
+ ×
W
( )
( )
( )
( )
1
1
1
1
1
1
2
1
1
K
K
y
y
y
×
=
Y
X
1
x
2
x
S
x
( )
1
,1
k
w
( )
1
,2
k
w
( )
1
,
k S
w
( )
( )
1
2
k
k
y
x
=
( )
( )
1
2
1
1
y
x
=
( )
( )
1
2
1
2
K
S
y
x
=
0
1
x = −
( )
1
,0
k
w
0
1
x = −
( )
2
,1
k
w
( )
2
2
,
k S
w
( )
2
k
y
( )
2
1
y
( )
2
2
K
y
( )
2
,0
k
w
( )
1
2
2
1
K
K
+ ×
W
( )
( )
( )
( )
2
2
2
2
1
2
2
2
1
K
K
y
y
y
×
=
Y
( )
1
2
1 1
K + ×
X
function [ W1 , W2 ] = init2 ( S , K1 , K2 )
% funkcja tworzy sieć dwuwarstwową
% i wypełnia jej macierze wag wartościami losowymi
% z zakresu od -0.1 do 0.1
% parametry: S – liczba wejść do sieci / liczba wejść warstwy 1
% K1 – liczba neuronów w warstwie 1
% K2 – liczba neuronów w warstwie 2 / liczba wyjść sieci
% wynik: W1 – macierz wag warstwy 1 sieci
% W2 – macierz wag warstwy 2 sieci
W1 = ...
W2 = ...
( )
1
1
1
S
K
+ ×
W
( )
1
2
2
1
K
K
+ ×
W
•
dzialaj2.m
- dla sieci o danych macierzach wag W1 i W2
dla podanego na wejście wektora X
oblicza wektory wyjść warstw Y1 i Y2
- neurony obu warstw mają sigmoidalną funkcję aktywacji
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
% funkcja symuluje działanie sieci dwuwarstwowej
% parametry: W1 – macierz wag pierwszej warstwy sieci
% W2 – macierz wag drugiej warstwy sieci
% X – wektor wejść do sieci
% sygnał podany na wejście ( sieci / warstwy 1 )
% wynik: Y1 – wektor wyjść warstwy 1 ( przyda się podczas uczenia )
% Y2 – wektor wyjść warstwy 2 / sieci
% sygnał na wyjściu sieci
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
( )
1
1 1
S + ×
X
( )
1
1
1
S
K
+ ×
W
( )
1
1
1
K ×
Y
1
S×
X
( )
1
2
1 1
K + ×
X
( )
1
2
2
1
K
K
+ ×
W
( )
2
2
1
K ×
Y
( )
1
1
1
K ×
U
( )
f i
1
−
i
1
−
i
( )
2
2
1
K ×
U
( )
f i
1
x
2
x
S
x
( )
( )
1
2
k
k
y
x
=
( )
( )
1
2
1
1
y
x
=
( )
( )
1
2
1
2
K
S
y
x
=
0
1
x
= −
0
1
x
= −
( )
2
k
y
( )
2
1
y
( )
2
2
K
y
( )
1
,1
k
w
( )
1
,2
k
w
( )
1
,
k S
w
( )
1
,0
k
w
( )
2
,1
k
w
( )
2
2
,
k S
w
( )
2
,0
k
w
function [ Y1 , Y2 ] = dzialaj2 ( W1 , W2 , X )
% funkcja symuluje działanie sieci dwuwarstwowej
% parametry: W1 – macierz wag pierwszej warstwy sieci
% W2 – macierz wag drugiej warstwy sieci
% X – wektor wejść do sieci
% sygnał podany na wejście ( sieci / warstwy 1 )
% wynik: Y1 – wektor wyjść warstwy 1 ( przyda się podczas uczenia )
% Y2 – wektor wyjść warstwy 2 / sieci
% sygnał na wyjściu sieci
beta = 5 ;
X1 = ...
U1 = ...
Y1 = ...
X2 = ...
U2 = ...
Y2 = ...
( )
1
1 1
S + ×
X
( )
1
1
1
S
K
+ ×
W
( )
1
1
1
K ×
Y
1
S×
X
( )
1
2
1 1
K + ×
X
( )
1
2
2
1
K
K
+ ×
W
( )
2
2
1
K ×
Y
( )
1
1
1
K ×
U
( )
f i
1
−
i
1
−
i
( )
2
2
1
K ×
U
( )
f i
•
przykład - XOR - w pliku
test2.m
P = [ 0 0
1 1
;
% wejścia sieci
0 1 0 1 ]
T = [ 0 1 1
0 ]
% żądane wyjście sieci
[ W1przed , W2przed ] = init2 ( 2 , 2 , 1 )
% najmniejsza dobra sieć
[ Y1 , Y2a ] = dzialaj2 ( W1przed , W2przed , P (:,1) ) ;
[ Y1 , Y2b ] = dzialaj2 ( W1przed , W2przed , P (:,2) ) ;
[ Y1 , Y2c ] = dzialaj2 ( W1przed , W2przed , P (:,3) ) ;
[ Y1 , Y2d ] = dzialaj2 ( W1przed , W2przed , P (:,4) ) ;
Yprzed = [ Y2a , Y2b , Y2c , Y2d ]
% [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , 2000 )
% [ Y1 , Y2a ] = dzialaj2 ( W1po , W2po , P (:,1) ) ;
% ...
%
Ypo = [ Y2a , Y2b , Y2c , Y2d ]
•
ucz2.m
- dla sieci o danych macierzach wag W1 i W2
uczy sieć przez zadaną liczbę epok
na podanym ciągu uczącym – macierze P i T
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
% funkcja uczy sieć dwuwarstwową
% na podanym ciągu uczącym (P,T)
% przez zadaną liczbę epok (n)
% parametry: W1przed – macierz wag warstwy 1 przed uczeniem
% P – ciąg uczący – przykłady - wejścia
% T - ciąg uczący – żądane wyjścia
% dla poszczególnych przykładów
% n - liczba epok
% wynik: W1po – macierz wag warstwy 1 po uczeniu
% W2po – macierz wag warstwy 2 po uczeniu
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
% schemat funkcji:
% losuj numer przykładu
% podaj przykład na wejścia i oblicz wyjścia
% oblicz błędy na wyjściach warstwy 2
-
ważna kolejnosć !
% oblicz błędy na wyjściach warstwy 1
-
ważna kolejnosć !
% oblicz poprawki wag warstw 1 i 2
- dowolna kolejność
% dodaj poprawki do wag warstw 1 i 2
- dowolna kolejność
% i to wszystko n razy
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
( )
1
1 1
S + ×
X
( )
1
1
1
S
K
+ ×
W
( )
1
1
1
K ×
Y
1
S×
X
( )
1
2
1 1
K + ×
X
( )
1
2
2
1
K
K
+ ×
W
( )
2
2
1
K ×
Y
( )
1
1
1
K ×
U
( )
f i
1
−
i
1
−
i
( )
2
2
1
K ×
U
( )
f i
( )
2
2
1
K ×
D
( )
2
2
1
K ×
E
( )
'
f
i
( )
1
1
1
K ×
D
BP
( )
1
1
1
K ×
E
( )
1
2
2
1
K
K
+ ×
dW
( )
1
1
1
S
K
+ ×
dW
1
x
2
x
S
x
( )
( )
1
2
k
k
y
x
=
( )
( )
1
2
1
1
y
x
=
( )
( )
1
2
1
2
K
S
y
x
=
0
1
x
= −
0
1
x
= −
( )
2
k
y
( )
2
1
y
( )
2
2
K
y
( )
1
,1
k
w
( )
1
,2
k
w
( )
1
,
k S
w
( )
1
,0
k
w
( )
2
,1
k
w
( )
2
2
,
k S
w
( )
2
,0
k
w
1
t
k
t
2
K
t
( )
2
1
d
( )
2
k
d
( )
2
2
K
d
( )
'
f
i
function [ W1po , W2po ] = ucz2 ( W1przed , W2przed , P , T , n )
liczbaPrzykladow = ...
W1 = ...
W2 = ... ; S2 = ...
wspUcz = ...
beta = 5
for i = 1 : n ,
los = ...
nrPrzykladu = ...
X = ...
X1 = ...
[ Y1 , Y2 ] = ...
X2 = ...
D2 = ...
% oblicz błędy na wyjściach warstwy 2
E2 = ...
% błąd „wewnętrzny” warstwy 2
D1 = ...
% oblicz błędy na wyjściach warstwy 1
- BACKPROPAGATION
E1 = ...
% błąd „wewnętrzny” warstwy 1
dW1 = ...
% oblicz poprawki wag warstwy 1 z uwzgl. pochodnej
dW2 = ...
% oblicz poprawki wag warstwy 2 z uwzgl. pochodnej
W1 = ...
% dodaj poprawki do wag warstwy 1
W2 = ...
% dodaj poprawki do wag warstwy 2
end
% i to wszystko n razy
W1po = ...
W2po = ...
•
przykład - XOR
- nie każda sieć
się nauczy…
•
przykład - XOR
- ale większość
się nauczy…
•
do funkcji ucz1 dodaj parametry:
–
m - maksymalna liczba epok uczenia
–
e
- błąd, który sieć ma osiągnąć
- sieć będzie się uczyć do osiągnięcia zadanego błędu,
ale nie dłużej niż przez maksymalną liczbę epok
–
k
- liczba pokazów w epoce
- liczba przykładów pokazywanych w jednej epoce uczenia
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2b-testXOR2b
–
funkcja ucz2b rysuje wykres błędu średniokwadratowego podczas uczenia
(w kolejnych epokach)
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2c-testXOR2c
–
funkcja ucz2c rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
–
funkcja ucz2c przyjmuje parametry: m, e, n i k
–
dla drugiej warstwy sieci funkcja ucz2c pokazuje błąd
na przykładach pokazanych w danej epoce
oraz na wszystkich przykładach z ciągu uczącego
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2d-testXOR2d
–
funkcja ucz2d rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
i wykres wszystkich wag sieci
–
reszta jak w funkcji ucz2c
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2dd-testXOR2dd
–
funkcja ucz2dd rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
i wykresy wag poszczególnych neuronów
–
reszta jak w funkcji ucz2d
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2e-testXOR2e
–
funkcja ucz2e rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
i wykresy wag poszczególnych neuronów
i wykres uproszczonych granic decyzyjnych sieci
(przy użyciu plot3 – klasy dla punktów z ciągu sprawdzającego)
–
reszta jak w funkcji ucz2d
–
w skrypcie testXOR2e oprócz XORa jest do wyboru kilka innych zestawów danych
–
podział ciągów na uczący, sprawdzający i testujący
–
tylko dla sieci o dwóch wejściach i jednym wyjściu
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2ee-testXOR2ee
–
funkcja ucz2ee rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
i wykresy wag poszczególnych neuronów
i wykres dokładnych granic decyzyjnych sieci
(przy użyciu surf – odpowiedzi sieci dla całego zakresu wejść)
–
reszta jak w funkcji ucz2e i test2e
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2eee-testXOR2eee
–
funkcja ucz2eee rysuje wykres błędu średniokwadratowego podczas uczenia
i wykres błędu klasyfikacji CE
i wykresy wag poszczególnych neuronów
i wykres dokładnych granic decyzyjnych sieci
(przy użyciu surf – odpowiedzi sieci dla całego zakresu wejść)
oraz poszczególnych neuronów
–
reszta jak w funkcji ucz2ee i test2ee
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2f-testFun2f
–
funkcja ucz2f rysuje wykres błędu średniokwadratowego podczas uczenia
i wykresy wszystkich wag sieci
i wykres funkcji przybliżanej przez sieć
–
dla sieci o jednym wejściu i jednym wyjściu
–
sieć uczy się aproksymować funkcję
do zrobienia
•
opracowany na zajęciach zestaw init2-dzialaj2-ucz2-test2
nazwij init2-dzialaj2-ucz2a-testXOR2a
•
opracuj kolejne:
–
init2-dzialaj2-ucz2g-testCzas2g
–
funkcja ucz2g rysuje wykres błędu średniokwadratowego podczas uczenia
i wykresy wszystkich wag sieci
i wykres szeregu czasowego
–
sieć uczy się predykcji szeregu czasowego
do zrobienia
•
zobacz, jak będą się uczyły sieci z większą liczbą neuronów ukrytych
•
zmodyfikuj algorytm uczenia:
–
dodaj momentum
–
zastosuj adaptacyjny współczynnik uczenia
•
po zakończonym uczeniu narysuj wykres
zależności funkcji celu od wybranej wagi sieci
(przy pozostałych wagach takich, jak po zakończeniu uczenia)
•
w trakcie uczenia rysuj wykres zależności funkcji celu od wybranej wagi
i pokaż proces minimalizacji funkcji celu
•
narysuj wykres 3D zależności funkcji celu od dwóch wybranych wag sieci
do zrobienia