No computer has ever been designed that is ever aware of what it's doing; but most of the time, we aren't either.
Marvin Minsky
NNS
NNS è una libreria composta da una gerarchia di classi atte a simulare reti di Hopfield e reti neurali multilayer
feedforward. E' completamente realizzata in C++ standard e si basa in modo sostanziale sulle STL.
Organizzazione
La libreria contiene nove classi i cui rapporti sono evidenziati nel seguente diagramma:
- pattern
- per gestire l'Input/Output di tutte le reti neurali;
- hopfield_net
- per simulare reti di Hopfield;
- multilayer_net
- per simulare reti multilayer feedforward;
- perceptron_net
- per simulare il Perceptron.
PATTERN
Rappresenta sequenze di valori binari o bipolari (a seconda del contesto) di lunghezza arbitraria, ma costante ed è realizzato in modo da minimizzare l'occupazione di spazio (ogni valore viene codificato mediante un unico bit). I costruttori dell'oggetto ne permettono l'inizializzazione a partire da molti altri tipi di dato, in particolar modo:
- tipi elementari
- unsigned e unsigned long;
- oggetti della libreria STL
- vettori di oggetti bool, stringhe di caratteri, vettori di tipo valarray.
HOPFIELD_NET
Permette di simulare una rete di Hopfield. Lo stato della rete è memorizzato in un array contenente una sola metà della matrice dei pesi (diagonale esclusa); altro spazio è riservato per registrare il numero di ricordi che si è tentato di inserire nella rete ed, eventualmente, nel caso se ne faccia uso, per la memorizzazione delle soglie dei neuroni. In definitiva per la descrizione di una rete di Hopfield di n neuroni si utilizza, nel caso peggiore, uno spazio proporzionale a ½·n·(n+1).
I principali metodi della classe sono descritti nella tabella seguente:
| TIPO | NOME | DESCRIZIONE |
|---|---|---|
| COSTRUTTORE | hopfield_net(size_t n) | rete di hopfield priva di ricordi costituita da n neuroni |
| INFORMAZIONI | hopfield_net(istream in) | rete di hopfield precedentemente memorizzata nello stream in. |
| energy(pattern p) | calcola l'energia dello stato p. | |
| full | true se la rete non può memorizzare altri ricordi. | |
| load | carico percentuale della rete. | |
| stable(pattern p) | true se lo stato p della rete è stabile. | |
| basin_of_attraction(pattern p, …) | calcola il bacino di attrazione dello stato p. | |
| records(…) | calcola l'insieme dei ricordi memorizzati nella rete. | |
| find(pattern p) | calcola il pattern evocato dalla rete quando le si presenta in ingresso il probe p. La modalità di attivazione è asincrona con minimizzazione dell'energia o casuale. | |
| I/O | insert(pattern p) | memorizza un nuovo ricordo. |
| remove(pattern p) | elimina un ricordo precedentemente memorizzato. | |
| operator <<(…) | memorizza lo stato della rete su file. |
MULTILAYER_NET
Permette di simulare una rete multilayer feed forward (il numero di hidden layer è arbitrario ma non può variare nel tempo). Lo stato della rete è memorizzato in un vettore di matrici che descrivono le connessioni intra-strato ed i bias. Tutti i calcoli vengono effettuati mediante l'uso della classe di supporto cmatrix e della classe STL valarray in modo tale da permettere ai compilatori di ottimizzare il codice per microprocessori ad architettura vettoriale o con istruzioni SIMD.
I principali metodi della classe sono di seguito elencati:
| TIPO | NOME | DESCRIZIONE |
|---|---|---|
| COSTRUTTORI | multilayer_net(list l) | inizializza una la rete in modo che abbia l.size() layer e che l'i-esimo layer sia costituito da l[i] neuroni. |
| multilayer_net(istream in) | inizializza la rete mediante i dati memorizzati nello stream in. | |
| INFORMAZIONI | average_quadratic_error | informazioni sui vari tipi di errore della rete dopo l'addestramento. |
| max_quadratic_error | ||
| max_error | ||
| fan_in(size_t i) | connessioni pre-sinapsi e post-sinapsi di un neurone dell'i-esimo layer. | |
| fan_out(size_t i) | ||
| Addestramento e simulazione | train(list a) |
addestra la rete mediante le associazioni della lista a. Permette di specificare diverse condizioni di
stop (mediante un'apposita classe stop_condition). Sono inoltre disponibili più opzioni per
l'addestramento:
|
| operator[pattern p] | calcola l'uscita della rete quando le si presenta in ingresso il pattern p. | |
| I/O | operator<<(…) | registra la rete su file. |
