I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I....

9
Retele neuronale. Lab 1: Initiere in MatLab si in utilizarea pachetului pentru retele neuronale (Neural Networks Toolbox) _____________________________________________________________________________________ I. Scurta introducere in MatLab 1. MATLAB = MATrix LABoratory (http://www.mathworks.com/ ) MATLAB este sistem interactiv destinat prelucrarilor numerice si simbolice asupra structurilor de tip matrice dar care permite si efectuarea unor prelucrari grafice si ofera suport pentru programarea diferitelor aplicatii cu caracter tehnic si stiintific. 2. Construirea matricilor: explicit (prin specificarea elementelor): [a11 a12 ... a1n; a21 a22 ... a2n; ... ;am1 am2 ... amn] Exemplu: A=[1 2 3; 4 5 6] Observatie: Elementele unei linii se separa prin spatiu sau virgula iar liniile se separa prin punct-virgula. folosind functii sistem: permit construirea unor matrici particulare Exemple: eye(5) (matricea identitate de dimensiune 5), zeros (2,3) (matrice de dimeniune 2 x 3 cu elemente nule), rand(3,4) (matrice 3x4 cu valori aleatoare uniform repartizate in [0,1]), randn(3,4) (matrice 3x4 cu valori aleatoare avand repartitia normala standard). prin incarcarea elementelor dintr-un fisier: load (‘<nume fisier>’) Exemplu: load(‘mat.dat’) - se genereaza o variabila cu numele mat care va contine matricea aflata in fisierul text mat.dat (o linie a fisierului corespunde unei linii din matrice). Functia load poate fi folosita si pentru incarcarea spatiului de lucru (fisier cu extensia .mat) salvat anterior cu save prin concatenarea unor matrici de dimensiuni compatibile: daca a este o matrice mxn iar b este o matrice mxk atunci c=[a b] (obt»inuta prin concatenare va fi o matrice mx(n + k), primele n coloane fiind din a iar ultimele k din b. Concatenand a' cu b' prin d=[a';b'] se obtine o matrice (n+k)xm. Operatorul ' aplicat postfixat unei matrici genereaza transpusa acesteia. Observatie. Vectorii sunt vazuti ca si cazuri particulare de matrici. Se face diferentiere intre vectorii linie si cei coloana. Un vector linie este o matrice cu o linie si mai multe coloane, pe cand un vector coloana este o matrice cu mai multe linii si o singura coloana. 3. Specificarea elementelor unei matrici: nume matrice(indice linie, indice coloana) Exemplu: modificarea valorii unui element al matricii: A(i,j)=expresie

Transcript of I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I....

Page 1: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

Retele neuronale. Lab 1: Initiere in MatLab si in utilizarea pachetului pentru retele neuronale (Neural Networks Toolbox) _____________________________________________________________________________________ I. Scurta introducere in MatLab 1. MATLAB = MATrix LABoratory (http://www.mathworks.com/) MATLAB este sistem interactiv destinat prelucrarilor numerice si simbolice asupra structurilor de tip matrice dar care permite si efectuarea unor prelucrari grafice si ofera suport pentru programarea diferitelor aplicatii cu caracter tehnic si stiintific. 2. Construirea matricilor:

• explicit (prin specificarea elementelor): [a11 a12 ... a1n; a21 a22 ... a2n; ... ;am1 am2 ... amn] Exemplu: A=[1 2 3; 4 5 6]

Observatie: Elementele unei linii se separa prin spatiu sau virgula iar liniile se separa prin

punct-virgula.

• folosind functii sistem: permit construirea unor matrici particulare

Exemple: eye(5) (matricea identitate de dimensiune 5), zeros (2,3) (matrice de dimeniune 2 x 3 cu elemente nule), rand(3,4) (matrice 3x4 cu valori aleatoare uniform repartizate in [0,1]), randn(3,4) (matrice 3x4 cu valori aleatoare avand repartitia normala standard).

• prin incarcarea elementelor dintr-un fisier: load (‘<nume fisier>’) Exemplu: load(‘mat.dat’) - se genereaza o variabila cu numele mat care va contine matricea aflata in fisierul text mat.dat (o linie a fisierului corespunde unei linii din matrice). Functia load poate fi folosita si pentru incarcarea spatiului de lucru (fisier cu extensia .mat) salvat anterior cu save

• prin concatenarea unor matrici de dimensiuni compatibile: daca a este o matrice mxn iar

b este o matrice mxk atunci c=[a b] (obt»inuta prin concatenare va fi o matrice mx(n + k), primele n coloane fiind din a iar ultimele k din b. Concatenand a' cu b' prin d=[a';b'] se obtine o matrice (n+k)xm. Operatorul ' aplicat postfixat unei matrici genereaza transpusa acesteia. Observatie. Vectorii sunt vazuti ca si cazuri particulare de matrici. Se face diferentiere intre vectorii linie si cei coloana. Un vector linie este o matrice cu o linie si mai multe coloane, pe cand un vector coloana este o matrice cu mai multe linii si o singura coloana. 3. Specificarea elementelor unei matrici: nume matrice(indice linie, indice coloana) Exemplu: modificarea valorii unui element al matricii: A(i,j)=expresie

Page 2: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

4. Subdomenii si submatrici: • m:n (reprezinta multimea valorilor intregi cuprinse intre m si n), • a:h:b (reprezinta multimea nodurilor diviziunii de pas h a intervalului [a,b]), • A(:,j) (reprezinta coloana j a matricii A), • A(i,:) (reprezinta linia i a matricii A; de exemplu A(1:3,:) reprezinta primele 3 linii din

A). • A(i1:i2,j1:j2) (reprezinta submatricea constituita din liniile cuprinse intre i1 si i2 si

coloanele cuprinse intre j1 si j2)

Observatii. 1. Valoarea h specificata ca pas in definirea unui subdomeniu poate fi atat pozitiva cat si

negativa. 2. Pentru determinarea dimensiunii unei matrici se foloseste functia size. Apelata pentru o

matrice returneaza o pereche de valori: prima valoare reprezinta numarul de linii iar a doua numarul de coloane. Pentru a retine in variabila lin numarul de linii ale unei matrici A iar in variabila col numarul de coloane se poate specifica: [lin col]=size(A).

3. Subdomeniul vid se specifica prin []. O matrice poate fi reorganizata prin eliminarea de linii

sau coloane. De exemplu, prin a(1,:)=[] se elimina prima linie a matricii iar prin a(:,2)=[] se elimina a doua coloana din matrice.

5. Operatii asupra matricilor: adunare (+), scadere (/), inmultire (*), transpunere (‘ ), ridicare la putere (^), determinarea inversei lui A (inv(A)), determinarea lui x din A*x=b (x=A\ b), determinarea lui x din x*A=b (x=A/b). Dac¸a se doreste efectuarea unor operatii la nivelul elementelor (de exemplu inmultirea sau ridicarea la putere) se folosesc operator de tip "punct": .* (pentru inmult»irea a dou¸a matrici la nivel de element), .^ (pentru ridicarea la putere a fiecarui element al matricii), ./ (pentru impartirea la nivel de element). 6. Operatori relationali si logici: egal (==), diferit (~ =), strict mai mic (<), mai mic sau egal (<=), strict mai mare (>), mai mare sau egal (>=), negatie logica (~), disjunctie logica (|), conjunctie logica (&). 7. Expresii si atribuire: expresiile se construiesc dupa regulile specifice limbajelor de programare iar atribuirea de valori variabilelor se specifica cu ajutorul operatorului =. Variabilele nu trebuie declarate iar numele lor poate fi constituit din litere, cifre si liniute de subliniere. MatLab face distinctie intre literele mici si literele mari (este case-sensitive). Variabilele numerice pot fi de tip intreg, real sau complex (cele complexe se specifica folosind simbolurile i sau j). Constante numerice predefinite: pi (π), i (constanta de la numere complexe), inf (simbolul pentru infinit), NaN (valoare nedefinita, de exemplu 0/0), eps (precizia de calcul in virgula flotanta). Pentru consultarea valorii unei variabile se specifica numele variabilei. Vizualizarea listei cu variabilele utilizate in sesiunea curent¸a se poate face prin comanda who sau prin consultarea ferestrei Workspace. Resetarea unei variabile se poate face prin comanda clear <nume variabila> 8. Functii de argument scalar: sin, cos, tan, asin, acos, atan, exp, log (logaritm natural), abs (modul), sqrt, sign (functia signum), round, floor, ceil, rem (restul impartirii intregi).

Page 3: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

9. Functii cu argument vectorial: max (maxim), min (minim), sum (suma), prod (produs), mean (medie aritmetica), std (abatere standard), median (mediana), sort (ordonare crescatoare). Observatie. Aplicate asupra unei matrici aceste functii sunt aplicate separat asupra fiecarei coloane producand un vector linie cu rezultate. Aplicate asupra unui vector (linie sau coloana) determina conduc la obtinerea rezultatului corespunzator functiei (cu exceptia lui sort). Exemplu: pentru a determina cel mai mic element al unei matrici: min(min(A)) 10. Fisiere de comenzi si functii definite de utilizator. MatLab este un sistem de tip interpretor (fiecare comanda este executata imediat dupa introducerea ei). Daca se doreste gruparea mai multor prelucri intr-un "program" se pot crea (prin intermediul editorului inclus in sistem) asa numitele fisiere de comenzi (fisiere cu extensia *.m numite “m-files”). Exista doua tipuri de "m-files": Script files: contin succesiuni de comenzi Matlab. La incarcarea fisierului se executa toate comenzile specificate. Variabilele au caracter global, in sensul ca efectul executiei instructiunilor din script se va regasi in valorile variabilelor din spatiul de lucru. Scriptul este lansat in executie prin tastarea numelui sau in fereastra de comanda sau prin activarea comenzii RUN (F5) din fereastra de editare. Este necesar ca directorul in care se afla fisierul cu comenzi sa fie cel current (directorul current se seteaza din meniul principal). Function files: definesc functii care completeaza prelucrarile oferite de sistem. Numele fisierului trebuie sa coincida cu numele functiei. Variabilele au caracter local. Functia poate returna mai multe rezultate. Antetul unei functii este de forma: function[rez1,rez2,…rezn]=numefunctie(par1,par2,…,parm) Functia se apeleaza simplu prin numele ei urmat de lista valorilor asignate parametrilor. In cadrul unui m-file se pot defini mai multe functii. Cea care are numele identic cu cel al fisierului este considerata functie principala iar celelalte sunt considerate subfunctii. Corpul unei functii se termina cu end. Pentru specificarea comentariilor se foloseste %. Exemplu: calculul mediei si abaterii standard pentru un vector (coloana) function [medie, abstd]=indicatori(x) m=size(x,1); % determinarea dimensiunii obiectului medie=sum(x)/m; abstd=sqrt(sum(x.^2)/m-medie^2); end % terminatorul este optional Dupa ce se defineste functia si se salveaza in fisierul indicatori.m apelul se poate realize prin: indicatori([1;3;4;5;4]). 11. Prelucrari alternative si repetitive. MatLab ofera un set de comenzi specifice programarii in stil imperativ corespunzatoare principalelor categorii de prelucrari: alternative si repetitive. Prelucrari alternative. Ramificarea prelucrarii in functie de satisfacerea unei conditii se poate specifica astfel:

Page 4: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

if <conditie> <prelucrari> else <prelucrari> end Conditia este de regula o expresie logica in care pot interveni operatori relationali (==,~=, <, >, <=, >=) sau logici (|, &). Daca pe o ramura sunt mai multe prelucrari acestea se separa prin virgula. Se pot suprapune mai multe prelucrari alternative astfel: if <conditie> <prelucrari> elseif <prelucrari> else <prelucrari> end Exemplu. Definirea unei functii semn care determina semmnul argumentului pe care il primeste: function [s]=semn(x) if x>0 s=1 elseif x==0 s=0 else s=-1 end In cazul ramificarii pe mai multe ramuri se poate folosi comanda switch similara instructiunii omonime din C: switch <expresie> case <expresie_de_caz>, <prelucrari> case <expresie_de_caz>, <prelucrari> ... otherwise, <prelucrari> end Un exemplu simplu de utilizare a comenzii switch este: arg=input('Valoare din multimea {1,2,3} =') switch arg case 1, disp 'unu' case 2, disp 'doi' case 3, disp 'trei' end

Page 5: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

Prelucrari repetitive. MatLab ofera comenzi de ciclare cu contor (for): for <variabila> = <subdomeniu> <prelucrare> ... <prelucrare> end si de ciclare conditionata anterior (while): while <conditie> <prelucrare> ... <prelucrare> end Observatie.

1. Daca sunt amplasate mai multe comenzi pe aceeasi linie, trebuie separate prin virgule.

2. Iesirea fortata dintr-un ciclu for sau while se poate face cu break. Exemple.

1. for i=1:10, i, end afiseaza valorile succesive pe care le ia variabila i.

2. while(n), disp(rem(n,2)),n=floor(n/2);, end afiseaza cifrele binare ale numarului n (in ordine inversa).

12. Siruri de caractere, afisare si preluare date: Sirurile de caractere se specifica intre apostrofuri (exemplu: ' Acesta e un sir de caractere'). Afisarea variabilelor si a sirurilor de caractere se face prin comanda disp care accepta un singur parametru (exemplu: disp('Rezultatul:');disp(rez)). Afisarea mesajelor de eroare se face prin comanda error care are si rolul de a intrerupe executia comenzilor ulterioare aflate intr-un "m-file" (exemplu: error('Eroare!')). In fisierele cu extensia *.m datele pot fi solicitate prin comanda input (exemplu: var=input ('Introduceti variabila')). 13. Reprezentari grafice: 2D: pentru reprezentarea graficului unei functii se specifica: x=a:h:b; plot(x,f(x)) unde [a; b] reprezinta domeniul de definitie, h pasul de discretizare a acestuia, iar f este functia de reprezentat. Pentru reprezentarea pe acelasi grafic a mai multor functii se specifica :

Page 6: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

x=a:h:b; plot(x,f(x),x,g(x),x,h(x)) Se poate specifica culoarea (r-rosu, b-albastru, g-verde, y- yellow etc.), tipul liniei (- - linie continua, - - - linie intrerupta, : - linie punctata) precum si simbolul pentru marcarea punctelor corespunzatoare nodurilor diviziunii (+, o) prin adaugarea unui al treilea parametru: plot(x,f(x),' r-o') La generarea unei figuri se va crea o fereastra cu reprezentarea grafica. La fiecare comanda grafica se redeseneaza in aceeasi fereastra. Exemplu. x=0:0.1:2*pi; plot(x,sin(x),x,sin(x/2),x,sin(2*x)); xlabel('x');ylabel('sinus'); legend('sin(x)','sin(x/2)','sin(2x)'); Pentru vizualizarea mai multor grafice in aceeasi fereastra se poate folosi comanda subplot(m,n,i) unde m si n reprezinta dimensiunile structurii tabelare unde vor plasate figurile iar i numarul de ordine al pozitiei. Exemplu. x=0:0.1:4*pi; subplot(1,3,1);plot(x,sin(x));xlabel('x');ylabel('sin(x)'); subplot(1,3,2);plot(x,sin(x/2));xlabel('x');ylabel('sin(x/2)'); subplot(1,3,3);plot(x,sin(2*x));xlabel('x');ylabel('sin(2*x)'); 3D: Pentru reprezentarea grafica a unei suprafete (corespunzatoare unei functii f definite pe domeniul [a; b] x[c; d] se parcurg urmatoarele etape:

• se defineste o grila a domeniului de definitie prin: [x,y]=meshgrid(a:hx:b,c:hy:d) (corespunzatoare pasilor de discretizare hx, respectiv hy)

• se calculeaza valorile functiei in nodurile grilei z=f(x,y) (se va tine cont ca x si y sunt

matrici)

• se reprezinta suprafata prin mesh(x,y,z) sau prin surf(x,y,z) Exemplu. Reprezentarea functiei f (x,y)=x2+y2 definita pe [-2, 2] x [-2; 2] folosind acelasi pas de discretizare (0.1): [x, y]=meshgrid(-2:0.1:2); z=sqrt(x.^2+y.^2); mesh(x,y,z); pause; meshc(x,y,z); pause; contour(x,y,z); pause; contour3(x,y,z);

Page 7: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

14. Alte structuri de date: Tablouri multidimensionale. Extind structura de matrice (tablou bidimensional). Pot fi create in aceleasi moduri ca si matricile specificand insa mai multe dimensiuni. Elementele se identifica prin specificarea tuturor indicilor incadrati ntre paranteze. Exemplu. a=rand(2,3,4) - genereaza un tablou cu 4 elemente, fiecare fiind o matrice 2x3. Elementul de pe pozitia (i, j, k) se specifica prin a(i,j,k). Vectori de celule (cell arrays). Extind structura de tablou multidimensional, elementele componente ale tabloului putand fi de dimensiuni diferite. Se creaza prin gruparea intre acolade a mai multor tablouri ce pot avea dimensiuni diferite. Elementele se identifica prin indice cuprins intre acolade. Exemplu. Crearea unui vector cu trei celule (fiecare celula este o matrice de alta dimensiune): a=rand(2,2); b=rand(3,3); c=rand(4,4); d={a b c} Specificarea primei celule (matricea a): d{1}. Specificarea primei linii din a doua celula: d{2}(1,:). Observatie. Continutul matricilor a, b si c este copiat in vectorul d. Structuri neomogene. Sunt colectii de date de diverse tipuri ale caror elemente pot fi identificate prin calificare (nu prin indexare ca la celelalte structuri de mai sus), fiecarui element asociindu-se un nume. Sunt similare structurii de articol din limbajele de programare de uz general (de exemplu tipul struct din C). Structurile pot fi la randul lor organizate in vectori. Exemplu. Definirea unei structuri cu numele art prin completarea separata a campurilor: art.nume='popescu'; art.tabel=rand(2,2); Adaugarea unui nou element in vectorul cu structuri: art(2)=struct('nume','ionescu','tabel',rand(2,2)) Consultarea continutului primului articol: art(1). Consultarea campului nume din toate elementele vectorului art: art.nume 15. Alte particularitati ale lucrului in Matlab: a) Pentru inhibarea afisarii rezultatului unei evaluari se foloseste separatorul ; (exemplu: a=[1 2 3];) b) Pentru trecerea la linia urmatoare fara a efectua evaluarile din linia curenta se folose»ste separatorul : (exemplu: a=[1 2 3]:) c) Intreruperea evaluarii unor comenzi se face cu CTRL+BREAK d) Salvarea sesiunii curente se face prin functia Save Workspace din meniu prin care se transfera informatiile corespunzatoare sesiunii curente intr-un fisier cu extensia .mat. Reincarcarea sesiunii se face cu Load Workspace.

Page 8: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

II. Neural Network Toolbox 1. Contine un ansamblu de functii MATLAB care implementeaza algoritmii de functionare si invatare a majoritatii tipurilor de retele neuronale. Functiile sunt flexibile permitand utilizatorului sa specifice arhitectura folosita (inclusiv tipul functiei de activare), sa indice modul de conectare intre unitati si sa aleaga intre mai multe variante de algoritmi de invatare. Pentru o trecere in revista a facilitatilor oferite de pachet se poate utilize: help nnet: vizualizeaza lista tuturor functiilor din pachet cu posibilitatea de a obtine informatii suplimentare despre fiecare nnd: ilustreaza prin programe demonstrative caracterizate prin interfete grafice principalele categorii de retele ce pot simulate (arhitecturile si algoritmii de invatare implementati sunt descrisi in cartea Neural Network Design - M. Hagan, H. Demuth, M. Beale). Pachetul contine atat functii cu caracter general (cum sunt sim pentru simularea unei retele sau adapt si train pentru antrenarea unei retele) cat si functii specifice unei anumite arhitecturi (cum sunt funct»iile de creare newlin, newff, newrbf etc.). Indiferent de arhitectura ei, o retea implementata in NN Toolbox este un obiect ale carui componente sunt tablouri (corespunzatoare nivelelor retelei), functii asociate proceselor de simulare si de antrenare precum si parametri de control. Exemple de aplicatii implementate in NN Toolbox:

• identificarea semnalelor folosind modele liniare (applin1), • predictii in serii temporale (applin2) , • recunoasterea sabloanelor temporale (appelm1), • recunoasterea caracterelor (appcr1)

Exemple de aplicatii ce contin interfete grafice:

• recunoasterea sabloanelor (formelor): nprtool • aproximarea (fitarea) datelor: nftool • gruparea datelor (clasificare nesupervizata): nctool

2. Reprezentarea grafica a functiilor de activare. Principalele functii de activare implementate in pachetul "neural networks" sunt:

• Heaviside: hardlim • signum: hardlims • liniara: purelin • rampa (cu valori in [0,1]): satlin • rampa (cu valori in [-1,1]): satlins • sigmoida (cu valori in (0,1)): logsig • tangenta hiperbolica (cu valori in (-1,1)): tansig

Page 9: I. Scurta introducere in MatLab - web.info.uvt.roweb.info.uvt.ro/~dzaharie/rn2009_lab1.pdf · I. Scurta introducere in MatLab . 1. ... Script files: contin succesiuni de comenzi Matlab.

Exercitiul 1. Reprezentarea grafica a functiilor de activare. Indicatie. x=-5:0.1:5; plot(x,logsig(x)) Daca se dore»ste reprezentarea in aceeasi fereastra a mai multor functii se poate folosi functia subplot: % Reprezentarea mai multor functii de tranfer % in aceeasi fereastra % definirea diviziunii domeniului de definitie x=-5:0.1:5; % definirea vectorului cu valorile functiilor y1=hardlim(x); y2=satlin(x); y3=logsig(x); % definirea primului "subgrafic" % (graficele formeaza un vector cu trei elemente) subplot(1,3,1); plot(x,y1,'r'); % trasare cu rosu title('Heaviside'); % amplasare titlu % definirea celui de al doilea "subgrafic" subplot(1,3,2); plot(x,y2,'b'); % trasare cu albastru title('Rampa [0,1]'); % definirea celui de al treilea "subgrafic" subplot(1,3,3); plot(x,y3,'g'); % trasare cu verde title('Logistica'); Exercitiul 2. Studiati influenta pragului de activare asupra iesirii produse de functie. Indicatie. Se vor reprezenta pe acelasi grafic f(x-p1),f(x-p2) ..., unde f este o functie de activare, iar p1, p2 ... sunt valori ale pragului. Exercitiul 3. Studiati influenta parametrului de ponderare a semnalului de intrare asupra iesirii produse de functie. Indicatie. Se vor reprezenta pe acelasi grafic f(p1*x),f(p2*x) ..., unde f este o functie de activare, iar p1, p2 ... sunt valori ale ponderii. Exercitiul 4. Studiati comportarea unui neuron cu o singura intrare folosind programul demon- strativ nnd2n1 si comportarea unui neuron cu doua intrari folosind programul demonstrativ nnd2n2.