Il programma associa.exe è in grado di memorizzare la associazione di coppie di immagini realizzate con files tipo ascii. Per comodità si possono usare immagini di lettere e numeri e associare in fase di addestramento lettere minuscole con corrispondenti lettere maiuscole o lettere con numeri. Il programma presenta il seguente menù:
a) apprendimento
b) esecuzione
c) display immagine input
d) display immagine output
e) set dimensionale immagine
f) load pesi sinaptici da file
g) store pesi sinaptici su file
h) editor(per creare immagini)
i) edit su matrice dei pesi
l) mappare semigraficamente matrice pesi su file
m) calcolo automatico della distanza di Hamming
n) terminazione programma
Utilizzando la funzione edit disegnate su files le immagini che vi interessano utilizzando i caratteri spazio(pixel spento) e "*"(pixel acceso)(vi sono sul dischetto immagini di lettere già preparate che potete seguire come esempio).
Effettuate la fase di apprendimento fornendo i nomi dei due files da associare e provate il richiamo con la funzione "esecuzione". Provate poi il richiamo modificando leggermente qualche pixels dell’ immagine di input: potrete vedere come output l immagine corretta associata.
In questo punto sta il vero significato di una memoria associativa realizzata con una rete neurale: una associazione tra due immagini potrebbe essere realizzata con un qualsiasi semplice algoritmo, ma una leggera imprecisione nei dati di input non porterebbe ad una risposta corretta.La rete neurale è in grado di essere insensibile al rumore presente nell’ input e risalire all’ immagine di input corretta, partendo da quella rumorosa, per poi fornire come output l immagine associata.
Abbiamo realizzato un robusto sistema di accesso alla memoria per contenuto e non per indirizzo.Provate a visualizzare l immagine di input con "c" dopo avere eseguito la rete con un input rumoroso e vedrete che l'immagine è stata corretta sui neuroni del primo strato della rete dai cicli dovuti ai segnali di riporto dall'output. Potete addestrare la rete neurale con altre coppie di immagini e verificare in esecuzione, ma noterete che la capacità di memoria è molto limitata per cui dopo quattro o cinque coppie cominceranno malfunzionamenti.
La funzione di trasferimento di ogni neurone di questa rete è del tipo a gradino(fig.2). Una rappresentazione schematica della rete è visibile in fig.1 dove si possono notare due strati di neuroni in cui i neuroni di ogni strato sono tra loro scollegati,mentre sono collegati i neuroni di strati differenti. La funzione di trasferimento va intesa come bidirezionale:
feedforward (ciclo input>output) backforward(ciclo di retroazione)
U(k)= -1 se SI(k)<0 U(k)=-1 se SI(k)<0
U(k)= +1 se SI(k)>=0 U(k)=+1 se SI(k)>=0
dove U(k)=uscita o attivazione del neurone k e SI(k)=sommatoria degli inputs del neurone k
La rete in esecuzione oscilla finché non è stato verificato uno stato di stabilità che corrisponde all’ assenza di variazioni di attivazione di ogni neurone della rete. In una realizzazione software si devono utilizzare alcune semplici procedure:
1) caricamento dei dati input nei neuroni del primo strato (vettore int) da file (pixels immagine)
2) visualizzazione dello stato dei neuroni del secondo strato(vettore int) mappati sull’ immagine
3) procedura apprendimento contenente regola di Hebb
4) procedura esecuzione che cicla finché non viene verificata la stabilità
Tralasciamo le procedure 1 e 2 che dipendono dall’ utilizzo specifico della rete che può essere differente dall’ associazione di immagini e, comunque, è abbastanza banale per un programmatore realizzare una procedura che porti i dati da un file grafico o di testo su un vettore binario (perché la rete accetta in input solo valori 0 o 1),o che visualizzi i dati binari contenuti in un vettore in forma grafica. Vediamo invece più in dettaglio la realizzazione delle funzioni di apprendimento ed esecuzione:
note: peso[k][j] =peso del collegamento tra il k_esimo neurone del primo strato e il j_esimo neurone del secondo strato
A[j]= somma dei segnali di ingresso del j_esimo neurone
U[j]= uscita del j_esimo neurone
apprendimento()
{ carica i dati input nel vettore neuroni primo strato di dimensione k carica i dati d’associare nel vettore neuroni secondo strato di dimensione j per ogni neurone output(j)
{ per ogni input(k)
{ peso [k][j]=peso[k][j] + input[k]*output[j] (regola di Hebb) }
} return }
esecuzione()
{ carica i dati di input nel vettore input di dimensione k finchè non è verificato stabilità=vero
{ stabilità=vero dall input verso l output: per ogni neurone output(j)
{ per ogni neurone input(k)
{A2(j)=A2(j)+U1(k) * peso[j][k]
} if (A2(j)>=0) then U2(j)=1 (funzione di trasferimento del neurone) else U2(j)=-1
} dall output verso l input(retroazione): per ogni neurone input(k)
{ per ogni neurone output(j)
{ A1(k)=A1(k)+U2(j) * peso[j][k]
} if((A1(k)<0 and U1(k)=1) or (A1(k)>=0 and U1(k)=-1)) then stabilità=falso (cambiamento)
if (A1(k)>=0) then U1(k)=1 (funzione di trasferimento del neurone)
else U1(k)=-1
} } (chiude il ciclo verifica stabilità) return }
Luca Marchese
Successivo: Altre funzioni di associa.exe
Sommario: Indice