![]() |
|
Neuro.dll
Lo ammetto, il nome non è molto bello...
si tratta comunque di una libreria, ancora in fase
sperimentale, che ho scritto per avere sempre a portata
di mano una rete neurale
comoda e veloce da configurare ed usare per i miei
programmi. La libreria implementa una rete neurale di tipo Multi Level Perceptron (MLP), e mette a disposizione poche e semplici funzioni di interfaccia per creare, personalizzare, addestrare e utilizzare (in avanti) la rete. Sono presenti anche due utili funzioni per il salvataggio e il caricamento della rete da file. E' possibile utilizzare la libreria con qualsiasi linguaggio che permetta di accedere a file di libreria (.dll) esterni (quindi C/C++, Visual Basic, Delphi...) in maniera estremamente semplice. Le funzioni di interfaccia hanno un livello di astrazione abbastanza alto e quindi permettono anche a chi non conoscesse bene la teoria delle reti neurali di usare la libreria. Anche per questo motivo molti degli aspetti più tecnici che riguardano la rete sono volutamente "nascosti" e/o inaccessibili. Le rete è vista come una "scatola nera" con soltanto degli ingressi e delle uscite accessibili. |
![]() |
Essendo un programma ancora piuttosto sperimentale ho tralasciato alcuni aspetti "minori" che sarebbero d'obbligo in un programma più completo e definitivo (ad esempio le funzioni di allocazione o di I/O non restituiscono il classico valore che indica l'esito dell'operazione). Inoltre per mantenere la compatibilità con il Visual Basic ho dovuto fare alcune scelte un pò stravaganti... (i programmatori più esperti li noteranno sicuramente).
Funzioni esportate dalla libreria
La libreria utilizza per rappresentare la rete
una struttura dati (NET) di cui è accessibile all'esterno
soltanto il puntatore, che viene utilizzato come una specie di
"handle". Questo rende possibile anche la
creazione di più reti, e quindi la creazione di una rete formata
da più reti che hanno compiti gerarchicamente diversi!
Il puntatore viene restituito dalla funzione che crea la rete e
deve essere conservato ed utilizzato nella chiamata delle altre
funzioni.
Le funzioni d'interfaccia disponibili sono:
NET* GenerateNetwork(INTG n, INTG* upl, REAL alpha, REAL eta, REAL gain); void InitializeRandoms(INTG s); void RandomWeights(NET* Net); void SetInput(NET* Net, REAL* Input); void GetOutput(NET* Net, REAL* Output); REAL GetError(NET* Net); void SetParam(NET* Net, REAL alpha, REAL eta, REAL gain); void SaveNet(NET* Net, char* FileName); NET* LoadNet(char* FileName); void SimulateNet(NET* Net, REAL* Input, REAL* Output, REAL* Target, INTG Training); void Informations();
Ecco le equivalenze dei i diversi tipi tra
diversi linguaggi:
Tipo |
Equivalente C |
Equivalente VB |
Lunghezza |
INTG |
short int |
Integer |
2 byte |
REAL |
float |
Single |
4 byte |
NET* |
long |
Long |
4 byte |
Descrizione dettagliata delle funzioni d'interfaccia:
NET* GenerateNetwork(INTG n, INTG* upl, REAL alpha, REAL eta, REAL gain);
Serve per creare
fisicamente la rete. I parametri sono:
n: numero di strati (layer) nella rete, incluso
il layer di ingresso. Ad esempio 3 significa: ingresso, strato
nascosto, uscita.
upl: è un array di n elementi che contiene il
numero di neuroni in ciuscuno strato (partendo dall'ingresso).
alpha: è il coefficiente di "momentum"
della rete, può essere 0 se non si vuole utilizzare.
eta: è la velocità di apprendimento (learning
rate) della rete.
gain: è il coefficiente di guadagno della
funzione sigmoide (coeff. ad esponente), regola la piattezza
della risposta.
Restituisce:
puntatore alla rete appena creata.
void InitializeRandoms(INTG s);
Setta il seme dei generatori di numeri casuali. il parametro s è il nuovo seme.
void RandomWeights(NET* Net);
Inizializza i pesi di tutti
i collegamenti della rete, in un range compreso tra -0.5 e 0.5.
In pratica resetta la rete (!!!).
Net: puntatore alla rete.
void SetInput(NET* Net, REAL* Input);
Carica nella rete gli input...
Credo che non serva quasi a niente... (!)
Net: puntatore alla
rete.
Input: array di dimensione uguale al numero
degli ingressi che contiene un valore per ogni ingresso.
void GetOutput(NET* Net, REAL* Output);
Legge le uscite calcolate...
Anche questa funzione è abbastanza inutile... :-)
Net: puntatore alla
rete.
Output: array di dimensione uguale al numero
delle uscite che viene riempito con le ultime uscite della rete.
REAL GetError(NET* Net);
Questa funzione è utile
invece, infatti restituisce il valore dell'errore attuale della
rete (che viene calcolato dopo ogni addestramento).
Net: puntatore alla rete.
Restituisce: valore dell'errore.
void SetParam(NET* Net, REAL alpha, REAL eta, REAL gain);
Setta i parametri della
rete (lasciando inalterato tutto il resto).
Net: puntatore alla rete.
alpha: è
il coefficiente di "momentum" della rete, può essere 0
se non si vuole utilizzare.
eta: è la velocità di apprendimento (learning
rate) della rete.
gain: è il coefficiente di guadagno della
funzione sigmoide (coeff. ad esponente), regola la piattezza
della risposta.
void SaveNet(NET* Net, char* FileName); NET* LoadNet(char* FileName);
Caricano e salvano
la rete su file. Belli, ma usare con cura: non sono stati
particolarmente testati in questa versione.
Net: puntatore alla
rete.
FileName: puntatore alla stringa terminante per
/0 che indica il nome e il percorso del file.
La funzione LoadNet restituisce il puntatore alla nuova rete
creata.
void SimulateNet(NET* Net, REAL* Input, REAL* Output, REAL* Target, INTG Training);
Questa è la
funzione principale. Permette di simulare la rete in avanti o di
addestrarla a secondo del valore di Training. La funzione
provvede anche a chiamare SetInput, GetOutput, e ad aggiornare l'errore
della rete.
Net: puntatore alla
rete.
Input: array di dimensione uguale al numero
degli ingressi che contiene un valore per ogni ingresso.
Output: array di dimensione uguale al numero
delle uscite che viene riempito con le uscite calcolate della
rete.
Target: array di
dimensione uguale al numero delle uscite che contiene il valore
voluto delle uscite (in fase di addestramento).
Training:
se vale 0 la rete viene fatta funzionare il avanti, se diverso da
0 la rete compie un passo di addestramento utilizzando Input e
Target come coppia ingresso-uscita.
void Informations();
Questa simpatica funzione una volta invocata provoca la comparsa di una finestra message box con informazioni riguardanti il programma. Forse sarebbe stato più utile fare apparire anche informazioni riguardanti la rete... Sarà per la prossima versione... :-)
Per maggiori dettagli consultare i files forniti
assieme alla libreria, sono presenti alcuni esempi di caricamento
e di interfacciamento con il C e il Visual Basci, che possono
essere utilizzati così come sono per potere utilizzare subito la
libreria.
Consulta gli esempi di implementazione in C e VB:
![]() |
Esempi
di implementazione ![]() |
Scarica il programma:
![]() |
Neuro10b.zip |
Neuro 1.0b
è un programma freeware.
(leggi il file "Leggimi.txt" per
maggiori informazioni)