Matteo Basei

Una collezione di piccoli programmi realizzati a scopo didattico.

NeuNet: digits recognizer una piccola rete neurale in grado di riconoscere cifre scritte a mano libera

"La via per imparare è lunga se si procede per regole, breve e efficace se si procede per esempi."

Lucio Anneo Seneca

Implementazione di una semplice rete neurale feedforward fully connected (se non sai nulla di reti neurali potresti dare un'occhiata a questo mio programma che cerca di mostrare la rappresentazione geometrica del funzionamento delle reti neurali) per il riconoscimento di cifre scritte a mano libera. In questo tipo di reti neurali i neuroni sono divisi in livelli (layer) ordinati. I neuroni di un livello ricevono in ingresso tutti e solo i valori di uscita del livello precedente.

La rete neurale, correttamente istruita, riconosce la cifra 2 scritta a mano libera.
La rete neurale, correttamente istruita, riconosce la cifra 2 scritta a mano libera.

La struttura delle rete

Il layer di input è costituito da 400 neuroni recettori collegati ad un riquadro di 20 x 20 pixel in cui è possibile disegnare a mano libera. Questi neuroni non fanno altro che dare in uscita il valore del pixel corrispondente (bianco o nero). L'hidden layer è costituito da 100 neuroni, ognuno dei quali ha in ingresso le uscite dei 400 neuroni di input. Infine il layer di output è costituito da 10 neuroni, uno per ogni cifra da 0 a 9. Ognuno di questi neuroni ha in ingresso le uscite dei 100 neuroni dell'hidden layer. Il numero di sinapsi è quindi 100 x 400 + 10 x 100 = 41000.

Riconoscimento della cifra 8. Si noti come la rete riconosca anche una certa somiglianza con le cifre 0 e 3.
Riconoscimento della cifra 8. Si noti come la rete riconosca anche una certa somiglianza con le cifre 3 e 5.

L'apprendimento

Per praticità l'apprendimento è stato fatto utilizzando immagini generate automaticamente. Il pulsante Generate dataset permette di generare 10 immagini 20 x 20 per ogni font presente nel computer in uso. Il pulsante Learn! esegue un ciclo di apprendimento sulle immagini generate, aggiornando i pesi sinaptici e le soglie di attivazione con la tecnica di retropropagazione degli errori (backpropagation) che ho spiegato in dettaglio in questa pagina.

Con 60 cicli di apprendimento basati su 265 font differenti (quindi 2650 immagini 20 x 20), ho ottenuto un discreto successo nel riconoscimento di cifre disegnate a mano. Il fatto che la rete neurale NON sia stata addestrata con cifre disegnate a mano, quindi con la tipologia di input che le si richiede poi di riconoscere, fa capire la potenza e la versatilità di sistemi basati sul paradigma delle reti neurali. Inoltre, altro grande pregio delle reti neurali, si ottengono ottimi risultati anche con input "sporchi".

Uno dei grandi pregi delle rete neurali sono gli ottimi risultati ottenibili anche con input "sporchi".
Uno dei grandi pregi delle rete neurali sono gli ottimi risultati ottenibili anche con input "sporchi".

La rete neurale può essere resettata con pesi sinaptici e soglie di attivazione random con il pulsante New. Il pulsante Load permette invece di caricare i pesi sinaptici e le soglie di attivazione di una rete precedentemente salvata con il pulsante Save.

Infine il pulsante Clear inputs cancella semplicemente il riquadro di input e il pulsante Random data carica un'immagine a caso tra quelle utilizzate per l'apprendimento, per verificare la risposta della rete.