MLP e Matlab

Simulazione di MLP con il Neural Network Toolbox di Matlab

La descrizione seguente fornisce le indicazioni di base sui passi necessari per addestrare e testare uan rete MLP come classificatore per il problema del riconoscimento di logo, utilizzando il Neural Network Toolbox di Matlab (versione 5.0 e seguenti). Per un riferimento completo all'uso di tale toolbox si rimanda alla guida in linea o al manuale d'uso del toolbox.

1. Importazione dei dati in Matlab

Il Neural Network Toolbox di Matlab prevede che i dati di ingresso per le reti siano organizzati in matrici in modo che ogni colonna della matrice corrisponde ad un vettore di ingresso. Più vettori di ingresso sono organizzati in una matrice per definire l'ambiente di apprendimento o un insieme batch su cui effettuare il test della rete.

I dati sui logo possono essere importati in Matlab a partire dal formato prodotto da grafo12 per gli autoassociatori. Per poter importare i dati in Matlab occorre leggere il file con la funzione autoread:

m = autoread(file,256);

Il file viene letto per righe eliminando il primo campo corrispondente al nome del pattern e l'ultimo che specifica l'etichetta della classe. La funzione produce direttamente una matrice nel formato richiesto dal Neural Network toolbox per i dati (ciascun esempio è una colonna della matrice risultante).

Per evitare la conversione ora descritta si può direttamente utilizzare il workspace che contiene le matrici logo0 logo1 logo2 logo3. Le matrici contengono 700 esempi ciascuna. Un logo è rappresentato con un vettore di 256 componenti. Le matrici hanno quindi dimensione 256x700 (ciascun esempio è una colonna). I dati possono essere visualizzati graficamente con la macro plotlogo presente nell'archivio contenente il workspace (logo.zip):

plotlogo(logo0,23);

visualizza il 23esimo pattern della matrice logo0.

1. Costruzione del learning set, validation set e test set

Si devono costruire le matrici lset, vset, tsetche contengono un certo numero di colonne estratte dalle 4 matrici dei logo e le matrici dei target contenenti (per colonna) i valori desiderati per le 4 uscite dell'MLP per ogni colonna corrispondente di lset, tset e vset.
 

  1. selezione delle colonne per ogni logo:  logo0(:,n1:n2) estrae dalla matrice logo0 tutte le colonne comprese fra gli indici n1e n2 (range di colonna 'n1:n2'). Il range di riga ':' indica 'tutte le righe'
  2. concatenazione delle colonne estratte per i singoli logo:  lset = [logo0(:,1:nl) logo1(:,1:nl) logo2(:,1:nl) logo3(:,1:nl)]; In questo caso sono prelevati i primi nl esempi per ogni logo (l'ambiente di apprendimento conterrà 4nl vettori).
  3. i target per le 4 classi sono rispettivamente le colonne [1 0 0 0]' , [0 1 0 0]' [0 0 1 0]' e [0 0 0 1]'. Le matrici di target per i pattern di  ingresso, contenuti in una matrice di esempi, sono ottenute concatenando una ripetizione di questi vettori per tante volte quanti sono gli esempi corrispondenti. Per ripetere un vettore si usa la funzione di matlab repmat(matrice da ripetere, numero di ripeationi sulle righe,  numero di ripetizioni sulle colonne). Per l'insieme  lset costruito al passo precedente la matrice dei target sarà: tlset = [repmat([1 0 0 0]',1,nl) repmat([0 1 0 0]',1,nl) repmat([0 0 1 0]',1,nl) repmat([0 0 0 1]',1,nl)];


2. Generazione della rete
La funzione per creare una rete multistrato utilizza come primo parametro una matrice con un numero di righe pari al numero di ingressi per la rete e 2 colonne. Per ogni riga è riportato il range di variazione della componente di ingresso corrispondente. La generazione di tale matrice può essere fatta con la funzione minmax del toolbox a partire da un insieme di dati (ad esempio quelli che saranno usati per l'apprendimento):

mm = minmax(lset);

Per creare la rete occorre poi specificare la sua struttura (numero di neuroni per ogni strato) e il tipo di neuroni per ogni strato. Può essere anche specificato il tipo di algoritmo di apprendimento da usare (consultare la guida per vedere quelli disponibili):

net = newff(mm,[10 4],{'tansig','logsig'},'trainrp');

Nel caso precedente la rete ha uno strato nascosto con 10 neuroni di tipo tansig e 4 neuroni di uscita di tipo logsig (sigmoide). Viene inoltre selezionato l'algoritmo di Rprop - trainrp -  (Resilient Backpropagation) che tenta di limitare problemi derivanti dall'ordine di grandezza delle componenti del gradiente (che tendono ad annullarsi quando i neuroni sono prossimi alla saturazione) utilizzando solo l'informazione sul segno delle singole derivate per determinare la direzione della variazione dei pesi della rete.

3. Addestramento
La funzione train permette di addestrare la rete. I parametri sono la rete inizializzata, la matrice dei dati di esempio e la matrice dei target corrispondenti:

net1 = train(net,lset,tlset);

La funzione produce la rete addestrata. L'addestramento continua fino a che non è verificato un criterio di arresto (costo minimo, numero massimo di epoche, gradiente nullo, ecc.). Si possono cambiare alcuni parametri dell'apprendimento modificando i campi opportuni della struttura net.  Ad esempio il numero massimo di epoche (criterio di arresto) può essere variato con:

net1.trainParam.epochs = 1000;

Per evitare che la rete si adatti "troppo" agli esempi dell'ambiente di apprendimento peggiorando le sue prestazioni in generalizzazione si può utilizzare un insieme di dati come validazione. Durante l'apprendimento viene monitorata la prestazione della rete su tale insieme; quando le prestazioni sull'insieme di validazione peggiorano (ovvero il costo inizia ad aumentare) si ferma il processo di apprendimento anche se le prestazioni sull'insieme di addestramento continuano a migliorare. Se si vuole usare l'insieme di validazione durante l'apprendimento occorre define una variabile che contiene gli esempi e i target corrispondenti:

v.P = vset;
v.T = tvset;

e poi chiamare la funzione train con un numero maggiore di parametri:

net3 = train(net,lset,tlset,[],[],v);

I due parametri [] sono utilizzati solo per reti ricorrenti.

4. Simulazione

Una volta addestrata la rete, si possono ottenere le sue uscite per un insieme di vettori di ingresso con:

out = sim(net1,tset);

dove tset è la matrice contenente per colonne i vettori da applicare all'ingresso della rete. Il risultato è una matrice in cui ogni colonna corrisponde al vettore delle uscite della rete (4 nel caso qui descritto) quando in ingresso è presente la colonna corrispondente della matrice degli ingressi.

La macro confusion presente nell'archivio che contiene il workspace (logo.zip) permette di visualizzare la matrice di confusione data la matrice delle uscite della rete e la matrice contenente le uscite corrette (i target). Ogni riga corrisponde ai logo effettivi di una classe;
le colonne dicono quanti dei logo di una classe vengono classificati nelle varie classi (la diagonale dà le classificazioni corrette, gli elementi extra-diagonale corrispondono alle classificazioni errate). Il criterio di classificazione utilizzato è quello di attribuire un vettore alla classe corrispondente all'uscita della rete di valore massimo. E' però previsto un criterio che corriponde al fatto che la rete non fornisce un'uscita certa. In tal caso il vettore di ingresso si considera incerto, ovvero reiettato. Il criterio di reiezione usato nella macro è  "l'uscita massima è inferiore a 0.7", ma possono essere previsti altri criteri. Un criterio di reiezione alternativo è quello di considerare incerti i vettori per i quali la differenza fra l'uscita massima e la successiva è inferiore ad una soglia prefissata.

confusion(out,tlset);

Si può visualizzare graficamente l'output della rete per tutto l'inseime di test con:

image(out*64);
colormap(gray);

Questa visualizzazione è particolarmente significativa se gli esempi sono ordinati per classi nelle colonne. In tal caso le zone bianche dovrebbero essere localizzate sulla diagonale dell'immagine visualizzata.



Download

Download del file di esempio per l'addestramento: logoMLP.m (4Kb)
Download del file Workspace contenente le matrici dei logo: logo.zip (1440Kb)
(Questo file contiene anche le macro per visualizzare i logo e per calcolare la confusion table)

 

[Home] [MLP] [Autoassociatori Neurali] [Reti Neurali Ricorsive]