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 Video YouTube

"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 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 (fully connected) e solo (feedforward) 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.

Se non sai nulla di reti neurali prima di continuare la lettura di questa pagina potresti dare un'occhiata a questo mio programma che mostra la rappresentazione geometrica del funzionamento delle reti neurali.

La struttura delle rete

L'input layer è 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 l'output layer è 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.

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.

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".

Le reti convoluzionali

In questo progetto, sviluppato in C#, ho voluto sviluppare da zero, a scopo didattico, il funzionamento di una rete neurale nella sua forma più elementare (feedforward e fully connected).

La naturale evoluzione di questo progetto consisterebbe nell'aggiunta di una serie di layer convoluzionali a monte dell'attuale layer fully connected. Il problema con una rete di questo tipo, interamente fully connected, è infatti che, in un certo senso, non possiede la nozione del fatto che gli input rappresentano una matrice di punti geometrici. La stessa identica cifra, disegnata in posizioni differenti, è rappresentata da valori di input completamente differenti, ma non sembra sensato dover reimparare a riconoscere una cifra per ogni possibile posizione che questa può assumere nel campo visivo. Gli strati convoluzionali risolvono questo problema. La loro struttura è ispirata alla reale organizzazione dei neuroni della corteccia visiva animale.

Ad oggi le moderne implementazioni di reti neurali sfruttano il calcolo parallelo permesso dalle GPU delle schede video (sfruttando l'implementazione dell'algebra lineare in comune tra grafica 3D e reti neurali) o da hardware apposito (TPU, Tensor Process Unit, che implementano specificatamente il calcolo tensoriale necessario). Sono inoltre disponibili diverse librerie e framework adatti alla realizzazione di progetti che necessitano del machine learning.