Neural Hopfield Network sau scrieți-vă programele finereader, intel®

În primul rând, trebuie să determinați ce este un neuron. În
biologia, neuronul este o celulă specializată din care constă sistemul nervos. Neuronul biologic are structura prezentată în Fig.

Neural Hopfield Network sau scrieți-vă programele finereader, intel®

Fig.1 Schema neuronului

Rețeaua neuronală poate fi introdusă ca un set de neuroni și relațiile lor inter-relaționale. Prin urmare, pentru a determina o rețea neurală artificială (nebiologică), este necesar:

  • Setați arhitectura rețelei;
  • Determina dinamica elementelor individuale ale rețelei - neuroni;
  • Definiți regulile prin care neuronii vor interacționa unul cu celălalt;
  • Descrieți algoritmul de învățare, adică formarea conexiunilor pentru rezolvarea sarcinii.

Ca o arhitectură a rețelei neuronale, va fi utilizată rețeaua Hopfield. Acest model, aparent, este cel mai frecvent model matematic din neuroștiință. Acest lucru se datorează simplității și vizibilității sale. Rețeaua Hopfield arată modul în care memoria poate fi organizată pe rețea din elemente care nu sunt foarte fiabile. Datele experimentale arată că, cu o creștere a numărului de neuroni eșuați la 50%, probabilitatea unui răspuns corect este extrem de apropiată de 100%. Chiar și o comparație sumară a rețelei neuronale (de exemplu, creierul) și calculatorul Von Neumann arată cât de mult diferența dintre aceste obiecte: de exemplu, frecvența modificărilor stărilor de neuroni ( „frecvență de ceas“) este mai mică de 200 Hz, în timp ce frecvența modificărilor stării de procesoare moderne pot ajunge mai multe GHz (10 9 Hz).

O descriere formală a rețelei Hopfield

Rețeaua constă din neuroni artificiali N, axonul fiecărui neuron este conectat la dendritele neuronilor rămași, formând un feedback. Arhitectura rețelei este prezentată în Fig. 2.

Neural Hopfield Network sau scrieți-vă programele finereader, intel®

Figura 2. Arhitectura rețelei neuronale Hopfield

Fiecare neuron poate fi în una din cele două stări:

Ecuațiile (1), (2), (3) și (5) sunt suficiente pentru a determina rețeaua neurală artificială a Hopfield și se poate proceda la implementarea acesteia.

Implementarea rețelei neuronale Hopfield definită mai sus se va face în C ++. Mai întâi, trebuie să definiți tipuri suplimentare de date (pentru mai multe detalii, consultați Listă 1)

  • tipul factorilor de ponderare (este selectat tipul de flotor);
  • tipul care descrie starea neuronului (este aleasă propria sa enumerare de tip);
  • un tip care descrie starea rețelei la momentul t (este selectat containerul vectorial standard);
  • un tip care descrie matricea coeficienților de ponderare a conexiunilor neuronale (vectorul container al vectorilor a fost ales).


Listarea 1. Definirea de noi tipuri

Învățarea în rețea sau, mai exact, calculul elementelor de matrice în conformitate cu (3) se face prin funcția LearnNeuroNet. care ia o listă de intrări de imagini de antrenament și returnează un obiect de tip link_koefs_t. Valorile sunt calculate numai pentru elementele triunghiulare inferioare. Valorile elementelor triunghiulare superioare se calculează în conformitate cu expresia (4). Vizualizarea generală a metodei LearnNeuroNet este afișată în listare 2.

Listing 2. Învățarea rețelei neuronale

Actualizarea stărilor neuronilor este implementată folosind functorul neuro_net_system. Starea inițială a functorului este transferată operatorului supraîncărcat al functorului. (în conformitate cu (5)) este un pointer la un obiect de tip neurons_line.

Operatorul functor modifică obiectul transmis de tipul neurons_line la starea rețelei neuronale în acel moment. Valoarea nu este fixată rigid și este definită de expresia:

și anume Când starea fiecărui neuron nu sa schimbat pentru 1 ciclu.

Pentru a calcula (2), se aplică 2 algoritmi STL:

  • produsul interior_ pentru calcularea sumei produselor cu coeficienți de greutate și stări neuronale (adică calcul (2) pentru un anumit);
  • pentru a calcula noi valori pentru fiecare neuron (adică calcularea punctului de mai sus pentru fiecare posibil)

Codul sursă pentru functorul neurons_net este afișat în listare 3.

Listarea 3. Un functor care implementează funcționarea unei rețele neuronale

Pentru a scoate imaginile de intrare și de ieșire în consola, tastați neurons_line_print_descriptor a fost creat. care stochează o legătură la imaginea și formatul formatării (lățimea și înălțimea dreptunghiului în care va fi înscrisă imaginea). Pentru acest tip, operatorul este redefinit <<. Исходный код типа neurons_line_print_descriptor и оператора вывода в поток показан в листинге 4.

Listarea 4. Învățarea rețelei neuronale

Pentru a testa performanța implementării, rețeaua neurală a fost instruită în două imagini cheie:

Fig.3 Imagini cheie

La intrare s-au dat imagini distorsionate. Rețeaua neuronală a recunoscut corect imaginile originale. Imaginile distorsionate și imaginile recunoscute sunt prezentate în figurile 4, 5

Fig.4 Recunoașterea imaginii 1

Fig.5 Recunoașterea imaginii 2

Programul este lansat din linia de comandă cu o linie ca: AppName WIDTH HEIGHT SOURCE_FILE [LEARNE_FILE_N]. în cazul în care:

  • AppName - numele executabilului;
  • LĂȚIME. HEIGHT - lățimea și înălțimea dreptunghiului, în care se vor potrivi imaginile de ieșire și chei;
  • SOURCE_FILE - fișierul sursă cu imaginea inițială;
  • [LEARNE_FILE_N] - unul sau mai multe fișiere cu imagini cheie (separate de un spațiu).

Pentru mai multe informații despre capacitățile de optimizare a compilatorului, consultați Notificarea noastră de optimizare.