TECHNICKÁ UNIVERZITA V KOŠICIACH FAKULTA ELEKTROTECHNIKY A INFORMATIKY KATEDRA KYBERNETIKY A UMELEJ INTELIGENCIE Jednoduchá aplikácia algoritmu spätného šírenia chyby (backpropagation) zadanie 3 z predmetu Teoretické základy umelej inteligencie Mária Virčíková Košice 2008
Obsah 1 Zadanie úlohy... 3 2 Funkcia programu... 3 2 Analýza riešenia... 3 2.1 Popis programu... 3 2.1.1 Topológia siete... 3 2.1.2 Inicializácia programu a nastavenie parametrov... 3 2.1.3 Nastavenie váh... 4 2.1.4 Učenie neurónovej siete... 5 2.1.5 Testovanie neurónovej siete... 6 3. Preklad programu... 7 3.1 Požiadavky na technické prostriedky... 7 3.2 Požiadavky na programové prostriedky... 7 4. Zhodnotenie riešenia... 7 5. Zlepšenie programu do budúcna... 7 6. Ukážka výstupu programu... 8 PRÍLOHA: Zdrojový kód... 8 FEI KKUI 2
1 Zadanie úlohy Úlohou bolo naprogramovať metódu spätného šírenia chyby a experimentálne tento algoritmus overiť na jednoduchej aplikácii, kde vstupom je obrázok, ktorý sa umelá neurónová sieť naučí. 2 Funkcia programu Programový systém slúži na naučenie neurónovej siete akýkoľvek obrázok, v mojom prípade to sú niektoré písmená. 2 Analýza riešenia Program bol riešený v programovacom jazyku Matlab, verzia 7.0. 2.1 Popis programu 2.1.1 Topológia siete Neurónová sieť má dva vstupy súradnice x a y pixela obrázku. Má jednu skrytú vrstvu s 50 neurónmi, čo sa dá ľahko v zdrojovom kóde zmeniť na iný počet. Výstupná vrstva je jeden neurón biely alebo čierny pixel. 2.1.2 Inicializácia programu a nastavenie parametrov Počet iterácií je nastavený na 10 tisíc, parameter učenia na 0.8 a počet neurónov v skrytej vrstve je 50. Neurónová sieť obsahuje len jednu skrytú vrstvu, pričom efektívnejšia by asi bola topológia siete s dvoma skrytými vrstvami. Po načítaní vstupného obrázku: vstup=imread('t.bmp') sa obrázok prevedie na čierno-biely príkazom I = im2bw(vstup); FEI KKUI 3
Na zrýchlenie programu sa odporúča odkomentovať riadok: % I=imresize(I,[5 5], 'nearest'); kde sa obrázok zmenší na 5x5 pixelov. Následne sa vstupný obrázok vykreslí v ľavom okne: subplot(1,2,1) imshow(i), title('original') Súradnice obrázku [sx,sy]=size(i); je potrebné znormalizovať na interval 0,1: %normalizacia suradnice x a y obrazka %sxn je suradnica x normalizovana %syn je suradnica y normalizovana for i=1:sx sxn(i)=i/(sx-1)-1/(sx-1); for i=1:sy syn(i)=i/(sy-1)-1/(sy-1); 2.1.3 Nastavenie váh Váhy sú inicializované náhodnými hodnotami z intervalu <-1;1>. Typy váh sú: váhy od súradníc x a y smerujúce do skrytej vrstvy váhy od skrytej vrstvy smerujúce do výstupnej vrstvy váhy biasu (1) na skrytej vrstve a váhy biasu na výstupnej vrstve min=-1; max=1; %vahy od suradnice x do skrytej vrstvy wijx(ns)= min + (max-min) * rand; %vahy od suradnice y do skrytej vrstvy wijy(ns)=min + (max-min) * rand; %vahy biasu na skrytej vrtsve FEI KKUI 4
w0hidden(ns)= min + (max-min) * rand; %vahy od skrytej vrstvy do vystupneho neuronu wki(ns)=min + (max-min) * rand; %vahy biasu na vystupe w0out= min + (max-min) * rand; 2.1.4 Učenie neurónovej siete Neurónovej sieti na začiatku ukážeme každý druhý pixel v riadku (normalizovaná súradnica x obrázku) a každý druhý pixel v stĺpci (normalizovaná súradnica y obrázku): for it=1:iteracie %ukazeme jej 2.pixel v riadku a kazdy 2. v stplci for r=1:2:sx for s=1:2:sy Očakávaná hodnota výstupu je biely alebo čierny pixel, v závislosti od zafarbenia pixela vstupného obrázku: if I(r,s)==1 ev=1; else ev=0; Aplikujeme vzorce na výstup skrytej vrstvy, pričom 1/(1+exp(-x)) je sigmoidálna funkcia a jej derivácia je 1/(1+exp(-x))^2*exp(-x): in(i)=sxn(r)*wijx(i)+syn(s)*wijy(i)+ w0hidden(i)*1; y(i)=1/(1+exp(-in(i))); inout=y(i)*wki(i); Aplikujeme vzorce na celkový výstup neurónovej siete: inout=inout+w0out*1; yout=1/(1+exp(-inout)) Vypočítame chybu, pričom error_out je celková chyba výstupu: error_out=(ev-yout)*(1/(1+exp(-inout))^2)*(exp(-inout)); FEI KKUI 5
Spätne vypočítavame chyby na skrytej vrstve neurónovej siete: error(i)= wki(i) * error_out * (1/(1+exp(-in(i)))^2)*exp(-in(i)); Dochádza k meneniu nastavovaniu váh neurónovej siete: w0out=w0out+par_uc*error_out*1; deltawki(i)=par_uc*error_out*y(i); deltawijx(i)=par_uc*error(i)*sxn(r); deltawijy(i)=par_uc*error(i)*syn(s); wki(i)=wki(i)+deltawki(i); wijx(i)=wijx(i)+deltawijx(i); wijy(i)=wijy(i)+deltawijy(i); w0hidden(i)=w0hidden(i)+par_uc*error(i)*1; %koniec zmeny vah 2.1.5 Testovanie neurónovej siete V cykle od 1 po rozmery obrázku vypočítavame výstup neurónovej siete: for m=1:sx for l=1:sy inout=0; yout=0; %skryta vrstva in(i)=sxn(m)*wijx(i)+syn(l)*wijy(i)+ w0hidden(i)*1; %sigmoidna funkcia f=1/(1+exp(-x)) y(i)=1/(1+exp(-in(i))); inout=y(i)*wki(i); %koniec skrytej inout=inout+w0out*1; yout=1/(1+exp(-inout)); Podľa hodnoty výstupu zafarbíme výstupný pixel: if yout >=0.5 I2(m,l)=1; else I2(m,l)=0; FEI KKUI 6
%koniec vyhodnotenia yout Vykreslíme obrázok na pravú časť: subplot(1,2,2), imshow(i2), title('nn pic') 3. Preklad programu 3.1 Požiadavky na technické prostriedky Program nemá žiadne špeciálne požiadavky na technické prostriedky. Bol testovaný na architektúre x86 a systéme Windows XP: Intel Centrino 1.5, 512 MB RAM, Intel Pentium M processor 740. 3.2 Požiadavky na programové prostriedky Aby program fungoval je nutné mať nainštalovanú Matlab a veľa trpezlivosti, keďže Matlab náročný na čas behu programu. 4. Zhodnotenie riešenia Program predstavuje implementáciu algoritmu spätného šírenia chyby a aplikácia postačuje na jeho demonštráciu. Zdrojový kód je dostatočne okomentovaný, takže používateľ by nemal mať problém s jeho pochopením. Problémy vznikli len pri hľadaní vhodných nastavení parametrov neurónovej siete. 5. Zlepšenie programu do budúcna Mohli by sa upresniť parametre ako sú parameter učenia, zvýšiť sa počet iterácií, počet neurónov v skrytej vrstve a interval nastavenia váh. Jedným z najdôležitejších vylepšení programového systému by mohlo byť zapojenie druhej skrytej vrstvy do topológie siete. FEI KKUI 7
V budúcnosti by mohol programový systém obsahovať databázu znakov napríklad abecedu písmen a vstupom by bola nejaký znak podobný želanému písmenu. Neurónová sieť by sa naučila vstupný obrázok, porovnala ho s písmenami v databáze a výstupom by bolo najpodobnejšie písmenko. 6. Ukážka výstupu programu Naučenie písmenka T : PRÍLOHA: Zdrojový kód %%%%%%%%%%%%%%1 Inicializacia%%%%%%%%%%%%%%%%%%%%%%%%% %clc; close all; clear all; iteracie=10000; par_uc=0.8; %parameter ucenia FEI KKUI 8
ns=50;%pocet neuronov v skrytej vrstve vstup=imread('t.bmp'); I = im2bw(vstup); % I=imresize(I,[5 5], 'nearest'); subplot(1,2,1) imshow(i), title('original') [sx,sy]=size(i); %normalizacia suradnice x a y obrazka %sxn je suradnica x normalizovana %syn je suradnica y normalizovana for i=1:sx sxn(i)=i/(sx-1)-1/(sx-1); for i=1:sy syn(i)=i/(sy-1)-1/(sy-1); %randomne vahy z intervalu <-1;1> min=-1; max=1; %vahy od suradnice x do skrytej vrstvy wijx(ns)= min + (max-min) * rand; %vahy od suradnice y do skrytej vrstvy wijy(ns)=min + (max-min) * rand; %vahy biasu na skrytej vrtsve w0hidden(ns)= min + (max-min) * rand; %vahy od skrytej vrstvy do vystupneho neuronu wki(ns)=min + (max-min) * rand; %vahy biasu na vystupe w0out= min + (max-min) * rand; %%%%%%%%%%%%%%%%%%2 Ucenie%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% for it=1:iteracie %ukazeme jej 2.pixel v riadku a kazdy 2. v stplci for r=1:2:sx for s=1:2:sy inout=0; yout=0; %ocakavana hodnota if I(r,s)==1 ev=1; else ev=0; FEI KKUI 9
%skryta vrstva in(i)=sxn(r)*wijx(i)+syn(s)*wijy(i)+ w0hidden(i)*1; %sigmoidna funkcia f=1/(1+exp(-x)) y(i)=1/(1+exp(-in(i))); %koniec skrytej % derivacia sigmoidnej funkcie = 1/(1+exp(-x))^2*exp(-x) inout=y(i)*wki(i); inout=inout+w0out*1; yout=1/(1+exp(-inout)); %chyba error_out=(ev-yout)*(1/(1+exp(-inout))^2)*(exp(-inout)); error(i)= wki(i) * error_out * (1/(1+exp(-in(i)))^2)*exp(- in(i)); %menime vahy w0out=w0out+par_uc*error_out*1; deltawki(i)=par_uc*error_out*y(i); deltawijx(i)=par_uc*error(i)*sxn(r); deltawijy(i)=par_uc*error(i)*syn(s); wki(i)=wki(i)+deltawki(i); wijx(i)=wijx(i)+deltawijx(i); wijy(i)=wijy(i)+deltawijy(i); w0hidden(i)=w0hidden(i)+par_uc*error(i)*1; %koniec zmeny vah %koniec pixlov v stlpci %koniec poctu pixlov v riadku %koniec iteracii %%%%%%%%%%%%3 Testovanie%%%%%%%%%%%%%%%%%%%%%%%%%% for m=1:sx for l=1:sy inout=0; yout=0; %skryta vrstva in(i)=sxn(m)*wijx(i)+syn(l)*wijy(i)+ w0hidden(i)*1; %sigmoidna funkcia f=1/(1+exp(-x)) y(i)=1/(1+exp(-in(i))); inout=y(i)*wki(i); %koniec skrytej inout=inout+w0out*1; FEI KKUI 10
yout=1/(1+exp(-inout)); if yout >=0.5 I2(m,l)=1; else I2(m,l)=0; %koniec vyhodnotenia yout %koniec stlpcov %koniec riadkov %%%%%%%%%%%%%%%%%%%% Vykreslenie natrenovaneho obrazku subplot(1,2,2), imshow(i2), title('nn pic') FEI KKUI 11