Date post: | 15-Apr-2016 |
Category: |
Documents |
Upload: | serban-laurentiu |
View: | 224 times |
Download: | 2 times |
Universitatea VALAHIA din TârgovişteFacultatea de Inginerie ElectricăSpecializarea Automatică și Informatică Aplicată
APLICAȚIE PENTRU CUNOASTERE A FORMELOR DINTR-O IMAGINE BINARA CU AJUTORUL RETELEI HOPFIELD
Disciplina:Inteligență artificială
StudentSERBAN Laurentiu- Florin
Anul IV (2015-2016)
1
Cuprins
Capitolul 1 - Introducere 3
Capitolul 2 - Algoritmul de antrenare al retelei Hopfield 4
Capitolul 3 - Realizarea aplicatiei cu ajutorul retelei Hopfield 5
Capitolul 4 - Codul sursa al aplicatiei 7
Bibliografie 14
2
Capitolul 1
INTRODUCERE
Reţeaua neurala Hopfield poate fi folosita ca memorie asociativă sau pentru rezolvarea unor probleme de optimizare. Foloseşte neuroni cu intrări binare, a căror ieşire conţine nelinearităţi de tipul limitare hardware. Arhitectura unei reţele Hopfield cu N neuroni este prezentată în Figura 1.2. Ieşirea fiecărui neuron este aplicată tuturor celorlalte noduri prin intermediul unor ponderi. Hopfield a demonstrat că această reţea converge dacă ponderile sunt simetrice. Deşi simplitatea ei o face atractivă, această reţea prezintă două limitări majore când este utilizată ca memorie adresabilă prin conţinut. În primul rând, numărul de forme prototip care pot fi stocate şi apoi regăsite corect în reţea este limitat la aproximativ 15% din numărul de neuroni. Dacă se încearcă stocarea prea multor forme prototip, reţeaua ar putea converge către un prototip fictiv. A doua limitare prezentă la reţeaua Hopfield apare dacă prototipurile memorate în reţea sunt foarte asemănătoare (prezintă un mare număr de biţi identici), caz în care reţeaua devine instabilă.
Dacă reţeaua Hopfield este folosită drept clasificator, ieşirea reţelei (după convergenţă) trebuie comparată cu fiecare formă prototip, după care se poate lua decizia de apartenenţă la una din clasele ataşate formelor prototip.
3
Capitolul 2
2.1. ALGORITMUL DE ANTRENARE AL RETELEI HOPFIELD
Pasul 1. Initializarea ponderilor conexiunilor
unde tij este ponderea conexiunii de la nodul „i” la nodul „j”
Pasul 2. Se aplica un vector de intrare necunoscut
Pasul 3. Itereaza pana la convergenta:
unde functia neliniara fh este de tipul limitare hardware. Operatia se repeta pana cand toate iesirile neuronilor raman neschimbate. In acest caz, configuratia iesirilor coincide cu forma prototip cea mai apropiata de forma necunoscuta de intrare.
Pasul 4. Repeta pasii 2-3 pentru orice alta forma necunoscuta de intrare
4
Capitolul 3
REALIZAREA APLICATIEI CU AJUTORUL RETELEI HOPFIELD
În primul rând, se va deschide o interfață de lucru GUI, prin tastarea >>guide în linie de comandă în Matlab.
În fereastra nou deschisă se poate observa o interfata de lucru. Aici se va creea interfata aplicatiei.
5
Pentru interfata de mai sus am folosit urmatoarele: 5 butoane de tip Push Button; 1 diagrama de tip Axes; 1 panou de tip Panel; 2 butoane de tip Edit Text.
Toate acestea au fost redenumite din fereastra de proprietati:
6
Capitolul 4
CODUL SURSA AL APLICATIEI
1. Resetarea retelei:a. Resetarea retelei se face accesand butonul RESETEAZA RETEAUA dupa
cum se vede in poza:
b. Codul care face posibila resetarea retelei este urmatorul:
function reset_Callback(hObject, eventdata, handles)% cleans all data and enables the change of the number of neurons used for n=1 : length(handles.hPatternsDisplay) delete(handles.hPatternsDisplay(n)); end handles.hPatternsDisplay = []; set(handles.imageSize,'enable','on'); handles.W = []; guidata(hObject, handles);
7
2. Incarcarea imaginii a. Incarcarea imaginii se face accesand butonul INCARCA IMAGINEA dupa
cum se vede in poza:
b.Codul care face posibila incarcarea imaginii este urmatorul:
% --- Executes on button press in loadIm.function loadIm_Callback(hObject, eventdata, handles) [fName dirName] = uigetfile('*.bmp;*.tif;*.jpg;*.tiff'); if fName set(handles.imageSize,'enable','off'); cd(dirName); im = imread(fName); N = str2num(get(handles.imageSize,'string')); im = fixImage(im,N); imagesc(im,'Parent',handles.neurons); colormap('gray'); end
8
3. Antrenarea reteleia. Antrenarea retelei se face cu ajutorul invatarii imaginii incarcate ulterior
accesand butonul ANTRENEAZA RETEAUA.
b. Codul din care face posibila antrenarea retelei este urmatorul:
% --- Executes on button press in train.function train_Callback(hObject, eventdata, handles)
Npattern = length(handles.hPatternsDisplay); if Npattern > 9 msgbox('more then 10 paterns isn''t supported!','error'); return end
im = getimage(handles.neurons); N = get(handles.imageSize,'string'); N = str2num(N); W = handles.W; %weights vector avg = mean(im(:)); %removing the cross talk part if ~isempty(W) %W = W +( kron(im,im))/(N^2); W = W + ( kron(im-avg,im-avg))/(N^2)/avg/(1-avg); else % W = kron(im,im)/(N^2); W = ( kron(im-avg,im-avg))/(N^2)/avg/(1-avg); end
9
% Erasing self weight ind = 1:N^2; f = find(mod(ind,N+1)==1); W(ind(f),ind(f)) = 0;
handles.W = W;
% Placing the new pattern in the figure... xStart = 0.01; xEnd = 0.99; height = 0.65; width = 0.09; xLength = xEnd-xStart; xStep = xLength/10; offset = 4-ceil(Npattern/2); offset = max(offset,0); y = 0.1;
if Npattern > 0 for n=1 : Npattern x = xStart+(n+offset-1)*xStep; h = handles.hPatternsDisplay(n); set(h,'units','normalized'); set(h,'position',[x y width height]); end x = xStart+(n+offset)*xStep; h = axes('units','normalized','position',[x y width height]); handles.hPatternsDisplay(n+1) = h; imagesc(im,'Parent',h); else x = xStart+(offset)*xStep; h = axes('units','normalized','position',[x y width height]); handles.hPatternsDisplay = h; end
imagesc(im,'Parent',h); set(h, 'YTick',[],'XTick',[],'XTickMode','manual','Parent',handles.learnedPaterns);
guidata(hObject, handles);
10
4. Formele invatate vor aparea in partea de jos a aplicatiei – in sectiunea “FORME INVATATE”.
5. Adaugarea zgomotuluia. Pentru a testa reteaua se poate incarca orice imagine binara sau se poate
incarca una din formele invatate si se poate adauga zgomot. Se poate alege orice nivel de zgomot de la 1% la 100%.
11
b. Codul pentru adaugarea zgomotului este urmatorul:% --- Executes on button press in addNoise.function addNoise_Callback(hObject, eventdata, handles) im = getimage(handles.neurons); % N = get(handles.imageSize,'string'); % N = floor(str2num(N)/2)+1; noisePercent = get( handles.noiseAmount, 'value' ); N = round( length(im(:))* noisePercent ); N = max(N,1); %minimum change one neuron ind = ceil(rand(N,1)*length(im(:)));% im(ind) = -1*im(ind); %!!!! im(ind) = ~im(ind); imagesc(im,'Parent',handles.neurons); colormap('gray');
6. Rularea aplicatiei se face apasand pe butonul EXECUTA:
12
a. Codul din spatele butonului EXECUTA este urmatorul:% --- Executes on button press in run.function run_Callback(hObject, eventdata, handles) im = getimage(handles.neurons); [rows cols] = size(im); if rows ~= cols msgbox('I don''t support non square images','error'); return; end N = rows; W = handles.W; if isempty(W) msgbox('No train data - doing nothing!','error'); return; end %figure; imagesc(W) mat = repmat(im,N,N); mat = mat.*W; mat = im2col(mat,[N,N],'distinct'); networkResult = sum(mat); networkResult = reshape(networkResult,N,N); im = fixImage(networkResult,N); imagesc(im,'Parent',handles.neurons);
13
BIBLIOGRAFIE :
H. Demuth, M. Beale – “Neural Network Toolbox. User Guide” The MATHWORKS Inc. - www.mathworks.com http://www.victorneagoe.com/university/prai/lab6c.pdf http://engpedia.ir/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-
%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%B3%D9%88%D8%B1%D8%B3-hopfield-neural-network/
14