View Full Version : [C/C++] Reti neurali
sto studiando le reti neurali attraverso materiale trovato in rete e alcune videolezioni della mia università.
Quello che mi interessava sviluppare attraverso una rete neurale è un sistema che sia in grado di predirre malfunzionamenti di meccanismi attraverso l'acquisizione di segnali di numerosi sensori.
Farei leggere alla rete migliaia di dati in modo da costruire un modello di riferimento ed in base a questo, determinare i vari comportamenti del meccanismo.
Da dove si parte a sviluppare?
Esistono eempi simili al mio problema?
grazie
matlab però non è free.
Non ho ancora compreso in cosa consiste però l'apprendimento di una rete neurale.
Teoria a parte: ho un neurone che si attiva entro una certa soglia.
A=w1*x1 + w2*x2 dove w è il peso.
se ho ad esempio w1=1, w2=-1 e x1=-1, x2=1 e mi aspetto in uscita -1
-1*-1 + 1*1 = 2 che è > -1 quindi decremento il peso di un tot sino ad avvicinarmi a quel -1, almeno, così ho capito.
Arrivato in prossimità del risultato desiderato devo memorizzare quei valori dei pesi per quell'input in modo che per quei valori di ingresso uso sempre i medesimi pesi?
scusate l'OT
matlab però non è free.
Non ho ancora compreso in cosa consiste però l'apprendimento di una rete neurale.
Teoria a parte: ho un neurone che si attiva entro una certa soglia.
A=w1*x1 + w2+x2 dove w è il peso.
se ho ad esempio w1=1, w2=-1 e x1=-1, x2=1 e mi aspetto in uscita -1
-1*-1 + 1*1 = 2 che è > -1 quindi decremento la soglia di un tot sino ad avvicinarmi a quel -1, almeno, così ho capito.
Arrivato in prossimità del risultato desiderato devo memorizzare quei valori dei pesi per quell'input in modo che per quei valori di ingresso uso sempre i medesimi pesi?
scusate l'OT
no, i pesi sono unici e fissi per ogni pattern di input in modo che gli stessi pesi funzionino su tutti i possibili input.
infatti ogni pattern di test nel ciclo di apprendimento da un contributo(parziale che dipende da quanto si scosta il risultato da quello atteso) alla variazione dei pesi di input
no, i pesi sono unici e fissi per ogni pattern di input in modo che gli stessi pesi funzionino su tutti i possibili input.
infatti ogni pattern di test nel ciclo di apprendimento da un contributo(parziale che dipende da quanto si scosta il risultato da quello atteso) alla variazione dei pesi di input
io avevo capito che terminato un ciclo di calcolo, determni l'errore e lo sommi ai pesi e quindi ripeti sino a quando l'output non è quello atteso: sbaglio?
Teo@Unix
10-01-2012, 15:56
Il mio consiglio è che prima di scrivere codice è bene che studi in modo più approfondito la teoria delle reti neurali, infatti il problema che vuoi risolvere è probabile che necessiti di una rete feed-forward addestrata con un algoritmo "error-back propagation".
Ti consiglio di iniziare da libri di testo.
E sviluppare prima semplici esempi, che sia in C o C++ o in python non è che fa differenza, devi comprendere bene il modello del neurone e i processi di addestramento che sono di vario tipo, a seconda della configurazioe e del problema da risolvere.
Prova prima a realizzare una configurazione per addestrare un neurone ad eseguire un AND o OR logico...
Poi ti occuperai del tuo problema, per le reti il fattore importate è la qualità e la varietà del set di addestramento. Se si hanno anche titubanze sugli algoritmi, introduci troppi fattori che ti creano poi mal di testa... :)
Il mio consiglio è che prima di scrivere codice è bene che studi in modo più approfondito la teoria delle reti neurali, infatti il problema che vuoi risolvere è probabile che necessiti di una rete feed-forward addestrata con un algoritmo "error-back propagation".
Ti consiglio di iniziare da libri di testo.
E sviluppare prima semplici esempi, che sia in C o C++ o in python non è che fa differenza, devi comprendere bene il modello del neurone e i processi di addestramento che sono di vario tipo, a seconda della configurazioe e del problema da risolvere.
Prova prima a realizzare una configurazione per addestrare un neurone ad eseguire un AND o OR logico...
Poi ti occuperai del tuo problema, per le reti il fattore importate è la qualità e la varietà del set di addestramento. Se si hanno anche titubanze sugli algoritmi, introduci troppi fattori che ti creano poi mal di testa... :)
ciao,
ho letto differenti testi trovati qua e la in rete ma sono tutti troppo vaghi, nessuno che fa un esempio chiaro allo scopo di farti capire come si implementa via codice un neurone per addestrarlo a fare qualcosa. Ho partono con pseudocodice spiegato male oppure si abbandonano a ragionamenti puramente matematici senza approdare a nulla.
Sono quasi convinto che puoi farlo pure in VBA con excel un esperimento, ma il problema è trovare materiale valido di studio.
se vi spossono interessare due articoli illuminanti
http://www.webalice.it/capaso/DOCS/RETI_NEURALI/Baldassarre-IntroduzioneAlleRetiNeurali.pdf
http://info.iet.unipi.it/~lazzerini/sisd/Reti.pdf
ciao,
secondo voi come potrebbe essere il pattern di input di ogni singolo numero di questo esempio ?
http://cs.felk.cvut.cz/~koutnij/studium/jocr/jocr.html
starfred
15-01-2012, 10:10
ciao, per il data set generalmente si utilizzano matrici, nel tuo caso utilizza matrici 8x12. Dopo di che crei le tue 10 matrici che rappresentano i numeri, per esempio il numero 1 puoi farlo così
08800
00800
00800
(Ho fatto una 4x4 perché non mi andava di fare una 8x12 :D cmq il concetto è quello)
A questo punto che hai il tuo bel data set, devi fare il training set cioè è necessario presentare alla rete un certo numero di esempi alterati in modo da renderla in grado di “generalizzare” il più possibile una volta ultimato l’addestramento. Quindi sempre nel caso di prima
88800
00800
00800
Puoi essere utilizzato nel training set per indicare un "uno" disturbato.
Finito questo fai il test set e vedi com'è la tua rete :D.
Per l'architettura della tua rete, per il numero di neuroni in ingresso, ti consiglio di utilizzare direttamente il numero di elementi della matrice, quindi se hai matrici 5x5 il numero dei neuroni del primo strato saranno 25 e la matrice in ingresso la inserisci come vettore colonna.
Spero di averti dato spunti di riflessione, ciao.
ciao, per il data set generalmente si utilizzano matrici, nel tuo caso utilizza matrici 8x12. Dopo di che crei le tue 10 matrici che rappresentano i numeri, per esempio il numero 1 puoi farlo così
08800
00800
00800
(Ho fatto una 4x4 perché non mi andava di fare una 8x12 :D cmq il concetto è quello)
A questo punto che hai il tuo bel data set, devi fare il training set cioè è necessario presentare alla rete un certo numero di esempi alterati in modo da renderla in grado di “generalizzare” il più possibile una volta ultimato l’addestramento. Quindi sempre nel caso di prima
88800
00800
00800
Puoi essere utilizzato nel training set per indicare un "uno" disturbato.
Finito questo fai il test set e vedi com'è la tua rete :D.
Per l'architettura della tua rete, per il numero di neuroni in ingresso, ti consiglio di utilizzare direttamente il numero di elementi della matrice, quindi se hai matrici 5x5 il numero dei neuroni del primo strato saranno 25 e la matrice in ingresso la inserisci come vettore colonna.
Spero di averti dato spunti di riflessione, ciao.
ciao,
ma per il risultato atteso ad esempio da 08800 cosa imponi?
ciao,
ma per il risultato atteso ad esempio da 08800 cosa imponi?
08800 è solo un pezzo del pattern di input: il pattern completo segnalato da starfred è 088000080000800 (in forma lineare) e il suo risultato atteso sarà "1"
come tu voglia esprimere "1" in uscita dalla rete è una tua scelta: per esempio puoi avere N output units, ognuna delle quali rappresenta una cifra (l'unità di output 1 si attiverà nel caso arrivi in ingresso un pattern rappresentante "1" mentre tutte le altre unità non si attiveranno: una cosa del tipo 100000000), oppure puoi avere una sola unità output che da risultati compresi tra 0 e 9 a seconda dell'input(e quindi in questo caso l'output atteso sarà semplicemente 1)
08800 è solo un pezzo del pattern di input: il pattern completo segnalato da starfred è 088000080000800 (in forma lineare) e il suo risultato atteso sarà "1"
come tu voglia esprimere "1" in uscita dalla rete è una tua scelta: per esempio puoi avere N output units, ognuna delle quali rappresenta una cifra (l'unità di output 1 si attiverà nel caso arrivi in ingresso un pattern rappresentante "1" mentre tutte le altre unità non si attiveranno: una cosa del tipo 100000000), oppure puoi avere una sola unità output che da risultati compresi tra 0 e 9 a seconda dell'input(e quindi in questo caso l'output atteso sarà semplicemente 1)
ciao,
pensavo che si dovesse seguire una inea precisa e non che l'output fosse deciso da chi implementa la rete.
Quindi nel caso di riconoscimento di caratteri, supponendoi di avere 12 patterni in input da 8 bit, come si decide a quale carettere corrisponde una data sequenza di patterns?
if (patterns1 == 1 && patterns2 == 1 && ........... )
Mi viene il dubbio in quanto se devo riconoscere ad esempio 10 caratteri, dovrei costruire 10 matrici le quali ognuna a seconda di cosa soddisfano mi informano di quale carattere si tratta.
Problema: ma se di oggetti da riconoscere ne ho qualche centinaio?
grazie
ciao
beh la struttura della rete è a discrezione dell'implementatore, sta a te scegliere l'approccio migliore e più congeniale al tuo problema
ovviamente con n output units dovrai controllarle tutte, mentre con un unica output dovrai andare a controllare il livello di attivazione dell'unità per capire la classificazione fatta: come vedi niente di complicato comunque
per quanto riguarda il numero di oggetti da riconoscere: beh si, se devi classificare 1000 oggetti diversi avrai bisogno di almeno un pattern di esempio per ognuno dei 1000 caratteri...un lavoro abbastanza lungo in effetti
ti lascio comunque le slide del corso, ora aggiornate, che seguii qualche anno fa
http://www.di.unito.it/~cancelli/retineur11-12.htm
nel tuo caso guarda bene percettrone, regola delta e magari multilayer
ciao
beh la struttura della rete è a discrezione dell'implementatore, sta a te scegliere l'approccio migliore e più congeniale al tuo problema
ovviamente con n output units dovrai controllarle tutte, mentre con un unica output dovrai andare a controllare il livello di attivazione dell'unità per capire la classificazione fatta: come vedi niente di complicato comunque
per quanto riguarda il numero di oggetti da riconoscere: beh si, se devi classificare 1000 oggetti diversi avrai bisogno di almeno un pattern di esempio per ognuno dei 1000 caratteri...un lavoro abbastanza lungo in effetti
ti lascio comunque le slide del corso, ora aggiornate, che seguii qualche anno fa
http://www.di.unito.it/~cancelli/retineur11-12.htm
nel tuo caso guarda bene percettrone, regola delta e magari multilayer
ciao,
grazie per i link.
Un chiarimento tenendo come esempio il riconoscimento dei caratteri
00088000 - 1
00800800 - 0
00800800 - 1
08000080 - 1
08000080 - 0
08000080 - 0
88888888 - 1
80000008 - 1
questi sono i pattern di riconoscimento del carattere A maiuscolo ad esempio: ma potrei anche costruire un pattern da 8x8 = 64 bit da analizzare tutto in una volta e se in uscita avessi ad esempio 1 potrei dire con una certa propabilità che si tratta del carattere A maiuscolo giusto?
Mi chiedo però se potrebbero esistere casi in cui ho in uscita ancora 1 ma il carattere non è una A maiuscola ed in questi casi come ci si comporta.
grazie
ciao,
grazie per i link.
Un chiarimento tenendo come esempio il riconoscimento dei caratteri
00088000 - 1
00800800 - 0
00800800 - 1
08000080 - 1
08000080 - 0
08000080 - 0
88888888 - 1
80000008 - 1
questi sono i pattern di riconoscimento del carattere A maiuscolo ad esempio: ma potrei anche costruire un pattern da 8x8 = 64 bit da analizzare tutto in una volta e se in uscita avessi ad esempio 1 potrei dire con una certa propabilità che si tratta del carattere A maiuscolo giusto?
esatto :)
a mio modo di vedere il problema della soluzione proposta sopra (suddividere il carattere in 8 pattern avendo un solo output e analizzare quindi gli 8 output distinti) è quello della difficile discriminazione tra caratteri:
la differenza tra una "i" ed uno spazio vuoto quale sarebbe?entrambe molto probabilmente darebbero "0" su tutti gli output
molto meglio sarebbe analizzare come dici tu 64 bit alla volta ed avere 26 output units(uno per carattere), attivandone una sola alla volta
Mi chiedo però se potrebbero esistere casi in cui ho in uscita ancora 1 ma il carattere non è una A maiuscola ed in questi casi come ci si comporta.
grazie
beh il rischio di attivazioni non volute c'è sempre, ma in teoria con un buon training set puoi ridurre il rischio entro un margine accettabile
c'è una cosa che non mi è chiara nell'esempio a pagine 13 di questo pdf http://www.webalice.it/capaso/DOCS/RETI_NEURALI/Baldassarre-IntroduzioneAlleRetiNeurali.pdf
Li si hanno dei pattern di input e si cercano dei parametri "w" i quali siano comuni a tutti i pattern.
Supponendo che io abbia già i miei pattern di riferimento e conosca i rispettivi output, a che mi servirebbe istruire la mia rete a quel modo?
grazie
c'è una cosa che non mi è chiara nell'esempio a pagine 13 di questo pdf http://www.webalice.it/capaso/DOCS/RETI_NEURALI/Baldassarre-IntroduzioneAlleRetiNeurali.pdf
Li si hanno dei pattern di input e si cercano dei parametri "w" i quali siano comuni a tutti i pattern.
Supponendo che io abbia già i miei pattern di riferimento e conosca i rispettivi output, a che mi servirebbe istruire la mia rete a quel modo?
grazie
ma questo è proprio il punto fondamentale della rete neurale :)
i pesi sono sempre comuni a tutti i pattern: quello che si cerca è una combinazione di pesi il più generica possibile, che vada bene cioè per tutti i possibili ingressi
i pattern di riferimento sono il training set, l'insieme di pattern scelti per addestrare la rete: sono scelti proprio perchè, sapendo a priori il risultato atteso, permettono di aggiustare i pesi in modo da ottenere dalla rete il risultato desiderato
una volta che la rete è stata istruita (e cioè che si è trovata una combinazione di pesi w tale che classifichi correttamente tutti i pattern del training set), essa sarà in grado, con buona approssimazione, di lavorare e di classificare correttamente qualsiasi pattern in ingresso (dello stesso tipo ovviamente)
ma questo è proprio il punto fondamentale della rete neurale :)
i pesi sono sempre comuni a tutti i pattern: quello che si cerca è una combinazione di pesi il più generica possibile, che vada bene cioè per tutti i possibili ingressi
i pattern di riferimento sono il training set, l'insieme di pattern scelti per addestrare la rete: sono scelti proprio perchè, sapendo a priori il risultato atteso, permettono di aggiustare i pesi in modo da ottenere dalla rete il risultato desiderato
una volta che la rete è stata istruita (e cioè che si è trovata una combinazione di pesi w tale che classifichi correttamente tutti i pattern del training set), essa sarà in grado, con buona approssimazione, di lavorare e di classificare correttamente qualsiasi pattern in ingresso (dello stesso tipo ovviamente)
ciao,
quindi vuoi dire che devo trovare dei parametri "w" comuni a tutti e 26 i caratteri che deisidero far riconoscere alla mia rete?
Cioè, dati(costruiti da me) 26 pattern da 64 bit e decisi i relativi output(risultati attesi da me) quindi che conosco, devo far determinare alla mia rete quei parametri "w" che mi forniscano i medesimi risultati "attesi" come output?
Se è così come ho intuito, è possibile che esistano più valori dei parametri che portino all'output corretto?
grazie
vendettaaaaa
17-01-2012, 16:35
ciao,
quindi vuoi dire che devo trovare dei parametri "w" comuni a tutti e 26 i caratteri che deisidero far riconoscere alla mia rete?
Cioè, dati(costruiti da me) 26 pattern da 64 bit e decisi i relativi output(risultati attesi da me) quindi che conosco, devo far determinare alla mia rete quei parametri "w" che mi forniscano i medesimi risultati "attesi" come output?
Se è così come ho intuito, è possibile che esistano più valori dei parametri che portino all'output corretto?
grazie
Sì, esistono più valori di w.
Praticamente il problema delle reti neurali è analogo ad un'interpolazione, e così il suo scopo: come usando una semplice parabola y = ax2 + bx + c per interpolare una curva si cercano i parametri a,b,c che meglio "piegano" la parabola per farla somigliare alla curva, nelle reti neurali fai questa cosa in più grande stile.
E' sempre comunque un approccio di tipo "black box": gli input entrano nella scatola nera, una funzione che li combina assieme ai parametri (i pesi w nelle reti, a b e c nella parabola) e da essa escono gli output y.
Possiamo dire che la struttura che dai alla rete equivale alla parabola (è la funzione che, dati gli input x e i parametri a,b,c, cioè i pesi nella rete neurale, ti restituisce y) mentre i pesi sono i parametri a,b,c, che vengono cambiati nel processo di addestramento della rete affinchè y predetto sia il più vicino possibile all'y reale, dati certi input x.
Ed esistono più combinazioni dei valori w semplicemente perchè li si ricava per regressione non lineare:
1) dai un valore di primo tentativo ai pesi W1
2) prendi il primo set di dati X1, li butti nel black box insieme a W1 e calcoli Ycalcolato1; se Ycalcolato1 differisce molto da Yreale1, cambi i pesi W1 in un certo modo (in che modo, lo decide il metodo numerico che stai usando)
3) col nuovo set di valori di W2 ripeti il punto 2 con un secondo set di dati X2, e confronti Ycalcolato2 con Yreale2; vai avanti così finchè trovi, ad una certa iterazione (ne serviranno sempre più all'aumentare del numero di dati in gioco, cioè numero di X, numero di pesi W, numero di set di addestramento X-Y), mettiamo alla 126° iterazione, che usando W126 hai che
(Ycalcolato-Yreale) < errore [NB: questo deve valere per tutti i set di dati di addestramento, non per uno solo, ovviamente]
A quel punto puoi affermare che la tua rete neurale può prevedere il comportamento del sistema reale per cui è stata addestrata, cioè ad ogni set di input X che coinvolgono il sistema, esso risponderà con Yreali che la tua rete può predirre con il grado di accuratezza che hai richiesto.
Non ho capito bene da che conoscenze parti, quindi forse il mio discorso dà per scontate alcune conoscenze che ti mancano, dimmi se c'è qualcosa di poco chiaro.
ciao,
mi è chiaro quello che scrivi ed il mio approcio coem ha visto è piuttosto pratico.
Mi creo dei pattern
000100001 | 1
110011001 | 0
...............| .
e così via; dopo il pipe c'è il valore atteso.
Quello che non mi è chiarissimo è: una volta costruiti i 26 pattern e stabiliti i 26 risultati, devo trovare i parametri w1, w2 da usare sui miei pattern in modo che mi forniscano come output i medesimi valori attesi da me imposti?
Ciò significherebbe che costruisco dei parametri w su un modello da me creato e uso successivamente tali parametri per i pattern "ingnoti" che riceverei in ingresso.
Se il pattern in ingresso mi fornisce uno dei risultati attesi allora siamo in presenza di un carattere: si usano così i parametri w una volta determinati?
grazie
vendettaaaaa
17-01-2012, 20:44
ciao,
mi è chiaro quello che scrivi ed il mio approcio coem ha visto è piuttosto pratico.
Mi creo dei pattern
000100001 | 1
110011001 | 0
...............| .
e così via; dopo il pipe c'è il valore atteso.
Quello che non mi è chiarissimo è: una volta costruiti i 26 pattern e stabiliti i 26 risultati, devo trovare i parametri w1, w2 da usare sui miei pattern in modo che mi forniscano come output i medesimi valori attesi da me imposti?
Ciò significherebbe che costruisco dei parametri w su un modello da me creato e uso successivamente tali parametri per i pattern "ingnoti" che riceverei in ingresso.
Se il pattern in ingresso mi fornisce uno dei risultati attesi allora siamo in presenza di un carattere: si usano così i parametri w una volta determinati?
grazie
Ho riletto tutto il topic e sì, credo che ci siamo, anche se in realtà il mio post era un po' generico e volevo solo sottolineare l'analogia tra rete neurale e funzione interpolante, perchè a dire il vero ho studiato le reti neurali in un corso di Ingegneria Chimica e solo teoricamente, mai applicate...
Cmq, a quanto ho capito vorresti fare così:
- Crei la matrice 8x8; riempi alcune caselle in modo da formare la lettera A; a questo punto i tuoi input sono i 64 bit della matrice: hai un vettore X di 64 elementi;
- Il vettore Y ha invece 1 elemento, cioè i 64 puntini determinano 1 carattere solo;
- A questo punto decidi la struttura della rete neurale, cioè decidi la funzione Y = f(X,W). Su questo non saprei consigliarti, immagino che ci siano strutture più adatte al tuo problema di altre. La più semplice sarebbe Y = sommatoria(Wi*Xi) con i=1,...,64 ma ad occhio non sembra una scelta brillante poichè è una funzione lineare sia nelle incognite che nei parametri, mentre le Reti Neurali eccellono nel riprodurre fenomeni fortemente non lineari.
- Da qui devi addestrare la rete. Però non devi usare solo 26 pattern: devi usarne di più, e diversi tra loro. In questo sito che hai linkato (http://cs.felk.cvut.cz/~koutnij/studium/jocr/jocr.html) ad esempio la rete è stata addestrata con 27 pattern, 3 per ogni numero, perchè c'è chi scrive il 3 in un modo e chi lo scrive in un altro modo. Se tu addestrassi la rete solo sui 26 pattern che prepari, 1 per carattere, otterresti una rete molto poco elastica, diciamo rigidissima. Come ti dicevano, la qualità della rete, cioè dei parametri W ricavati per regressione sui pattern di addestramento, dipende dalla qualità di questi ultimi, e soprattutto dalla loro diversità. Se inserisci più volte lo stesso pattern sposti l'addestramento "a favore" di questo.
- Gli algoritmi di addestramento sono vari. In generale cmq devi calcolare tutti gli Y (se usi 26 pattern, sono 26 Y, se usi 4 pattern per carattere saranno 26*4 e così via) e confrontarli coi valori attesi, correggere W, ricalcolare, ricorreggere e procedere finchè la somma degli scarti, cioè sommatoria(Yicalc - Yireale) è minore di un errore che stabilisci tu, più basso è più la rete sarà precisa, perlomeno sui pattern di addestramento (N.B.: se imponi un valore piccolissimo, rischi che la rete vada in overlearning, cioè i parametri W siamo bravissimi a riprodurre le Y dei pattern di addestramento ma sbaglino completamente a calcolare Y da pattern diversi. Ma questo è un altro discorso)
Ho riletto tutto il topic e sì, credo che ci siamo, anche se in realtà il mio post era un po' generico e volevo solo sottolineare l'analogia tra rete neurale e funzione interpolante, perchè a dire il vero ho studiato le reti neurali in un corso di Ingegneria Chimica e solo teoricamente, mai applicate...
Cmq, a quanto ho capito vorresti fare così:
- Crei la matrice 8x8; riempi alcune caselle in modo da formare la lettera A; a questo punto i tuoi input sono i 64 bit della matrice: hai un vettore X di 64 elementi;
- Il vettore Y ha invece 1 elemento, cioè i 64 puntini determinano 1 carattere solo;
- A questo punto decidi la struttura della rete neurale, cioè decidi la funzione Y = f(X,W). Su questo non saprei consigliarti, immagino che ci siano strutture più adatte al tuo problema di altre. La più semplice sarebbe Y = sommatoria(Wi*Xi) con i=1,...,64 ma ad occhio non sembra una scelta brillante poichè è una funzione lineare sia nelle incognite che nei parametri, mentre le Reti Neurali eccellono nel riprodurre fenomeni fortemente non lineari.
- Da qui devi addestrare la rete. Però non devi usare solo 26 pattern: devi usarne di più, e diversi tra loro. In questo sito che hai linkato (http://cs.felk.cvut.cz/~koutnij/studium/jocr/jocr.html) ad esempio la rete è stata addestrata con 27 pattern, 3 per ogni numero, perchè c'è chi scrive il 3 in un modo e chi lo scrive in un altro modo. Se tu addestrassi la rete solo sui 26 pattern che prepari, 1 per carattere, otterresti una rete molto poco elastica, diciamo rigidissima. Come ti dicevano, la qualità della rete, cioè dei parametri W ricavati per regressione sui pattern di addestramento, dipende dalla qualità di questi ultimi, e soprattutto dalla loro diversità. Se inserisci più volte lo stesso pattern sposti l'addestramento "a favore" di questo.
- Gli algoritmi di addestramento sono vari. In generale cmq devi calcolare tutti gli Y (se usi 26 pattern, sono 26 Y, se usi 4 pattern per carattere saranno 26*4 e così via) e confrontarli coi valori attesi, correggere W, ricalcolare, ricorreggere e procedere finchè la somma degli scarti, cioè sommatoria(Yicalc - Yireale) è minore di un errore che stabilisci tu, più basso è più la rete sarà precisa, perlomeno sui pattern di addestramento (N.B.: se imponi un valore piccolissimo, rischi che la rete vada in overlearning, cioè i parametri W siamo bravissimi a riprodurre le Y dei pattern di addestramento ma sbaglino completamente a calcolare Y da pattern diversi. Ma questo è un altro discorso)
sempre molto chiaro,
però resto col dubbio se una volta che ho definito i miei pattern, i parametri w che sperimento su ogni pattern dei 26 che ho creato devono fornirmi gli output che ho imposto io: non so se riesco a farmi capire.
Cioè, riesco a trovare i vari w1, w2, w3 che moltiplicati per i 64 bit di ogni patter e per tutti i 26 pattern mi forniscono in output i risultati da me attesi?
Di sicuro credo che esistano delle "w" particolari che riescono a soddisfare tutti gli output ma chiedo conferma.
Tale domanda ha il seguente significato:
se dai 26 pattern trovo delle w1, w2, wn che in un certo senso soddisfano tutti gli output, quando mi ritroverò a leggere un input che non conosco, sarà sufficiente, credo, fare i vari prodotti, determinare l'output corrispondente e attraverso questo determinare di quale carattere si tratta; sempre che una tale verifica sia sufficiente a farmi capire di quale carattere si tratta. Qui credo di aver inserito un altro piccolo dubbio e cioè, credo non sia sufficiente basarsi sull'output per stabilire di quale carattere viene dato in input.
grazie
vendettaaaaa
17-01-2012, 21:41
sempre molto chiaro,
però resto col dubbio se una volta che ho definito i miei pattern, i parametri w che sperimento su ogni pattern dei 26 che ho creato devono fornirmi gli output che ho imposto io: non so se riesco a farmi capire.
Cioè, riesco a trovare i vari w1, w2, w3 che moltiplicati per i 64 bit di ogni patter e per tutti i 26 pattern mi forniscono in output i risultati da me attesi?
Di sicuro credo che esistano delle "w" particolari che riescono a soddisfare tutti gli output ma chiedo conferma.
Tale domanda ha il seguente significato:
se dai 26 pattern trovo delle w1, w2, wn che in un certo senso soddisfano tutti gli output, quando mi ritroverò a leggere un input che non conosco, sarà sufficiente, credo, fare i vari prodotti, determinare l'output corrispondente e attraverso questo determinare di quale carattere si tratta; sempre che una tale verifica sia sufficiente a farmi capire di quale carattere si tratta. Qui credo di aver inserito un altro piccolo dubbio e cioè, credo non sia sufficiente basarsi sull'output per stabilire di quale carattere viene dato in input.
grazie
Facciamo un piccolo esempio, per facilità di scrittura usando numeri al posto di tutti i tuoi caratteri.
Facciamo che hai 2 pesi w, 3 x di input e 1 y di output.
I pesi iniziali sono w1 = 1, w2 = -1 (ne ho scelti 2 perchè non devono necessariamente essere uguali alle x).
La rete ha struttura (formula) y = w1*(x1+x2) - w2*(x1-x2+x3)
1° pattern: in input hai x1 = 1, x2 = 0, x3 = 1; devi ottenere y = 0
2° pattern: in input hai x1 = 0, x2 = 1, x3 = 0; devi ottenere y = 2
I pesi iniziali soddisfano il 1° pattern, ma non il 2°, infatti ycalc1 = 0, ycalc2 = 1.
Allora modifichiamo i pesi. Mettiamo w1 = 1.5, w2 = -0.5.
Otteniamo y1 = 1, y2 = 1.5. y1 è peggiorato ma y2 un poco è migliorato. Vai avanti finchè trovi i pesi, quali che siano, tali che (con W intendo il vettore [w1finale w2finale] e con X1 il vettore [x1 x2 x3])
[y(W,X1)-y1]^2 + [y(W,X2)-y2]^2 < 1.E-5 (cioè la somma del quadrato degli scarti tra valori calcolati e valori attesi sia inferiore a 1.E-5, valore che decido io).
Quindi i pesi finali che ho trovato, quando do come input X1, mi restituiscono un y1 calcolato che magari non è proprio 0, ma sarà 0.003, ad esempio.
Allo stesso modo, però, se prendo un terzo set di valori di input, mettiamo che siano x1 = 0, x2 = 0 e x3 = 1 e dovrei ottenere y = 1, la rete, se l'addestramento è stato buono, mi restituirà un valore molto vicino a 1.
Tornando ai caratteri, analogamente se al carattere A siffatto
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0----0-
00000000
0------0
corrisponde il valore 9 (perchè cmq qui si lavora sempre con dei numeri) e la addestri bene, essa restituirà un valore molto vicino a 9 (magari anche 9, dipende dai parametri), cmq non necessariamente 9. E così, quando inserirai questo
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0---0--
00000000
0------0
la rete restituirà cmq un numero vicino a 9, perchè cambia solo un bit rispetto all'immagine di prima. Ovviamente potrai solo dire che l'input è una A al 90% (numero alto, a caso) di accuratezza, non al 100%. Funziona così, infatti sempre parlando di quel sito là, quando disegni un numero ti esce l'accuratezza con cui lo riconosce e anche la % di somiglianza con altri numeri.
Dovremmo esserci :D
Facciamo un piccolo esempio, per facilità di scrittura usando numeri al posto di tutti i tuoi caratteri.
Facciamo che hai 2 pesi w, 3 x di input e 1 y di output.
I pesi iniziali sono w1 = 1, w2 = -1 (ne ho scelti 2 perchè non devono necessariamente essere uguali alle x).
La rete ha struttura (formula) y = w1*(x1+x2) - w2*(x1-x2+x3)
1° pattern: in input hai x1 = 1, x2 = 0, x3 = 1; devi ottenere y = 0
2° pattern: in input hai x1 = 0, x2 = 1, x3 = 0; devi ottenere y = 2
I pesi iniziali soddisfano il 1° pattern, ma non il 2°, infatti ycalc1 = 0, ycalc2 = 1.
Allora modifichiamo i pesi. Mettiamo w1 = 1.5, w2 = -0.5.
Otteniamo y1 = 1, y2 = 1.5. y1 è peggiorato ma y2 un poco è migliorato. Vai avanti finchè trovi i pesi, quali che siano, tali che (con W intendo il vettore [w1finale w2finale] e con X1 il vettore [x1 x2 x3])
[y(W,X1)-y1]^2 + [y(W,X2)-y2]^2 < 1.E-5 (cioè la somma del quadrato degli scarti tra valori calcolati e valori attesi sia inferiore a 1.E-5, valore che decido io).
Quindi i pesi finali che ho trovato, quando do come input X1, mi restituiscono un y1 calcolato che magari non è proprio 0, ma sarà 0.003, ad esempio.
Allo stesso modo, però, se prendo un terzo set di valori di input, mettiamo che siano x1 = 0, x2 = 0 e x3 = 1 e dovrei ottenere y = 1, la rete, se l'addestramento è stato buono, mi restituirà un valore molto vicino a 1.
Tornando ai caratteri, analogamente se al carattere A siffatto
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0----0-
00000000
0------0
corrisponde il valore 9 (perchè cmq qui si lavora sempre con dei numeri) e la addestri bene, essa restituirà un valore molto vicino a 9 (magari anche 9, dipende dai parametri), cmq non necessariamente 9. E così, quando inserirai questo
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0---0--
00000000
0------0
la rete restituirà cmq un numero vicino a 9, perchè cambia solo un bit rispetto all'immagine di prima. Ovviamente potrai solo dire che l'input è una A al 90% (numero alto, a caso) di accuratezza, non al 100%. Funziona così, infatti sempre parlando di quel sito là, quando disegni un numero ti esce l'accuratezza con cui lo riconosce e anche la % di somiglianza con altri numeri.
Dovremmo esserci :D
ciao,
mi è chiaro quello che dici, forse chiedo io nel modo sbagliato.
Sono le "w" iniziali che mi interessano, cioè capire se devono essere settate una volta per tutte.
prendo il tuo esempio
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0----0-
00000000
0------0
che trasformo per semplicità in un'unica riga
---00-----0--0----0--0---0----0--0----0--0----0-000000000------0
da questo pattern mi attendo come output 1
ne costruisco un altro per la lettera B che lascio uguale alla lettera A in quanto ci serve solo per capire, ma in realtà supponiamo chi sia il patter della lettera B
---00-----0--0----0--0---0----0--0----0--0----0-000000000------0
e da questo pattern mi attendo come output zero
e via di seguito sino al carattere che desidero riconoscere.
A questo punto ho a disposizione i pattern "teorici", quelli costruiti da me per i quali conosco l'ouput atteso.
Domanda:
per addestramento della rete, si intende che una volta costuiti i miei pattern "teorici" ed i relativi output che conosco, devo far determinare ad un algoritmo i vari parametri w che soddisfano tutti gli output attesi?
E' un pò come se desiderassi trovare tutti quei parametri "w" comuni a tutti i pattern.
grazie
vendettaaaaa
18-01-2012, 08:51
ciao,
mi è chiaro quello che dici, forse chiedo io nel modo sbagliato.
Sono le "w" iniziali che mi interessano, cioè capire se devono essere settate una volta per tutte.
prendo il tuo esempio
---00---
--0--0--
--0--0--
-0----0-
-0----0-
-0----0-
00000000
0------0
che trasformo per semplicità in un'unica riga
---00-----0--0----0--0---0----0--0----0--0----0-000000000------0
da questo pattern mi attendo come output 1
ne costruisco un altro per la lettera B che lascio uguale alla lettera A in quanto ci serve solo per capire, ma in realtà supponiamo chi sia il patter della lettera B
---00-----0--0----0--0---0----0--0----0--0----0-000000000------0
e da questo pattern mi attendo come output zero
e via di seguito sino al carattere che desidero riconoscere.
A questo punto ho a disposizione i pattern "teorici", quelli costruiti da me per i quali conosco l'ouput atteso.
Domanda:
per addestramento della rete, si intende che una volta costuiti i miei pattern "teorici" ed i relativi output che conosco, devo far determinare ad un algoritmo i vari parametri w che soddisfano tutti gli output attesi?
E' un pò come se desiderassi trovare tutti quei parametri "w" comuni a tutti i pattern.
grazie
Sì esatto, è proprio così! Alla fine dell'addestramento avrai dei pesi W che non dovranno più cambiare. L'addestramento è proprio la modifica di W dai valori iniziali a quelli che meglio "fittano" (uso questo termine tipico della regressione perchè è il campo dove applico normalmente questo concetto) tutto il set di addestramento.
Questo perchè in teoria la rete neurale si applica ad un sistema fisico che è governato da certe leggi, che fanno in modo che per un dato input X, quel sistema restituisca sempre un dato Y. Dato che tipicamente queste leggi sono complessissime anche per sistemi semplici, noi ci limitiamo a formulare una funzione "interpolante", vuoi una parabola, vuoi una rete neurale, che abbia dei parametri adattivi. Una volta decisa la struttura, si trovano tali parametri studiando le varie coppie input-output. Quando otteniamo un buon set, possiamo dire che l'unione della funzione e dei suoi parametri è la migliore approssimazione dell'insieme di leggi fisiche che, dato un certo input, producono un certo output, e quindi usiamo questo strumento per predire output da input che non abbiamo studiato, ma siamo sicuri siano governati dalle stesse leggi e quindi produrranno un output simile a quello calcolato con la nostra approssimazione di quelle leggi (la rete).
Cmq se ci pensi la rete neurale è perfetta in questo caso: l'input è un nostro pensiero, l'output è la rappresentazione grafica di un carattere...la funzione reale il cui comportamento stiamo cercando di approssimare è...il cervello umano :sofico:
Sì esatto, è proprio così! Alla fine dell'addestramento avrai dei pesi W che non dovranno più cambiare. L'addestramento è proprio la modifica di W dai valori iniziali a quelli che meglio "fittano" (uso questo termine tipico della regressione perchè è il campo dove applico normalmente questo concetto) tutto il set di addestramento.
Questo perchè in teoria la rete neurale si applica ad un sistema fisico che è governato da certe leggi, che fanno in modo che per un dato input X, quel sistema restituisca sempre un dato Y. Dato che tipicamente queste leggi sono complessissime anche per sistemi semplici, noi ci limitiamo a formulare una funzione "interpolante", vuoi una parabola, vuoi una rete neurale, che abbia dei parametri adattivi. Una volta decisa la struttura, si trovano tali parametri studiando le varie coppie input-output. Quando otteniamo un buon set, possiamo dire che l'unione della funzione e dei suoi parametri è la migliore approssimazione dell'insieme di leggi fisiche che, dato un certo input, producono un certo output, e quindi usiamo questo strumento per predire output da input che non abbiamo studiato, ma siamo sicuri siano governati dalle stesse leggi e quindi produrranno un output simile a quello calcolato con la nostra approssimazione di quelle leggi (la rete).
Cmq se ci pensi la rete neurale è perfetta in questo caso: l'input è un nostro pensiero, l'output è la rappresentazione grafica di un carattere...la funzione reale il cui comportamento stiamo cercando di approssimare è...il cervello umano :sofico:
ottimo,
manca l'ultima domanda :D
Ho determinato tutte le mi belle w e conosco l'output di ogni pattern "teorico" che ho memorizzato in una qualche struttura dati più o meno efficiente, l'importante è che ho a disposizione tali dati.
Leggo alcuni dati di input, ad esempio 64 bit ignoti, e voglio capire se si tratta di un carattere oppure se è qualcosa d'altro: come faccio?
Prendo ogni bit e lo moltiplico per i parametri w che avevo determinato in precedenza e una volta ottenuto il risultato vado a verificare se appartiene ad uno di quelli che ho a disposizione?
grazie
vendettaaaaa
18-01-2012, 09:53
ottimo,
manca l'ultima domanda :D
Ho determinato tutte le mi belle w e conosco l'output di ogni pattern "teorico" che ho memorizzato in una qualche struttura dati più o meno efficiente, l'importante è che ho a disposizione tali dati.
Leggo alcuni dati di input, ad esempio 64 bit ignoti, e voglio capire se si tratta di un carattere oppure se è qualcosa d'altro: come faccio?
Prendo ogni bit e lo moltiplico per i parametri w che avevo determinato in precedenza e una volta ottenuto il risultato vado a verificare se appartiene ad uno di quelli che ho a disposizione?
grazie
Una volta che la rete è addestrata, ogni input di 64 bit ti darà un valore numerico. Quindi la rete ti dirà soltanto quale carattere le hai disegnato in input, non sarà in grado di riconoscere se ad esempio scrivi un numero, in quanto tu le hai insegnato solo a distinguere i caratteri, è specializzata su quello e non sa fare altro.
Al limite puoi fare così: se il numero Y che deriva dalla combinazione algebrica, lineare o no a seconda della struttura della rete, dei pesi W, che ora ti sono noti, e dei 64 bit "nuovi" in ingresso non si avvicina abbastanza a nessuno dei valori che corrispondono ai caratteri noti, cioè ad esempio:
A dovrebbe generare y = a circa 5, B y = circa 16 e C = circa -3, ed in input hai una a minuscola che ti genera 105,
puoi mettere in output un messaggio tipo "Attenzione! Non riconosco il carattere" o cose del genere. La rete non può affermare con certezza che non hai scritto un carattere ma un numero, semplicemente può dirti che non hai scritto nulla che lei conosca.
Cmq l'unico modo è mettersi lì. Fossi in te comincerei a cercare come strutturare la rete, cioè stabilire la relazione matematica tra X,W e l'output y:
uso y = w1*(x1+x2)-w2*(x2-x3+2x1)
oppure uso y = w1*(x1+x2)/w2*(x2-x3) + 2*x1 e così via
Tieni conto che la struttura della rete deriva dalla struttura dei neuroni della rete: quanti livelli hai, in che modo i neuroni sono interconnessi, che funzionalità li lega tra di loro...io ho studiato solo questo:
http://homes.chem.polimi.it/dmanca/DECDPC/Lez%2005%20Reti%20Neurali%20Artificiali.pdf
e ripeto, mai fatto in pratica, ma il metodo è quello!
E poi provare a riconoscere prima solo 3 numeri, disegnati in 5-6 modi diversi, quindi con 5-6 pattern di addestramento.
Una volta che la rete è addestrata, ogni input di 64 bit ti darà un valore numerico. Quindi la rete ti dirà soltanto quale carattere le hai disegnato in input, non sarà in grado di riconoscere se ad esempio scrivi un numero, in quanto tu le hai insegnato solo a distinguere i caratteri, è specializzata su quello e non sa fare altro.
Al limite puoi fare così: se il numero Y che deriva dalla combinazione algebrica, lineare o no a seconda della struttura della rete, dei pesi W, che ora ti sono noti, e dei 64 bit "nuovi" in ingresso non si avvicina abbastanza a nessuno dei valori che corrispondono ai caratteri noti, cioè ad esempio:
A dovrebbe generare y = a circa 5, B y = circa 16 e C = circa -3, ed in input hai una a minuscola che ti genera 105,
puoi mettere in output un messaggio tipo "Attenzione! Non riconosco il carattere" o cose del genere. La rete non può affermare con certezza che non hai scritto un carattere ma un numero, semplicemente può dirti che non hai scritto nulla che lei conosca.
Cmq l'unico modo è mettersi lì. Fossi in te comincerei a cercare come strutturare la rete, cioè stabilire la relazione matematica tra X,W e l'output y:
uso y = w1*(x1+x2)-w2*(x2-x3+2x1)
oppure uso y = w1*(x1+x2)/w2*(x2-x3) + 2*x1 e così via
Tieni conto che la struttura della rete deriva dalla struttura dei neuroni della rete: quanti livelli hai, in che modo i neuroni sono interconnessi, che funzionalità li lega tra di loro...io ho studiato solo questo:
http://homes.chem.polimi.it/dmanca/DECDPC/Lez%2005%20Reti%20Neurali%20Artificiali.pdf
e ripeto, mai fatto in pratica, ma il metodo è quello!
E poi provare a riconoscere prima solo 3 numeri, disegnati in 5-6 modi diversi, quindi con 5-6 pattern di addestramento.
quindi come output atteso per ogni pattern potrei avere ad esempio 157 per il carattere A, 188 per il carattere B e via dicendo giusto?
Importante è trovare una w che soddisfi i vari output.
Dall'esempio che avevo visto nel PDF sembrava che i valori di output attesi dovessero valere solo zero oppure 1
grazie
vendettaaaaa
18-01-2012, 10:57
quindi come output atteso per ogni pattern potrei avere ad esempio 157 per il carattere A, 188 per il carattere B e via dicendo giusto?
Importante è trovare una w che soddisfi i vari output.
Dall'esempio che avevo visto nel PDF sembrava che i valori di output attesi dovessero valere solo zero oppure 1
grazie
A quale pdf ti riferisci? E a che pagina?
http://www.webalice.it/capaso/DOCS/RETI_NEURALI/Baldassarre-IntroduzioneAlleRetiNeurali.pdf
a pagina 12 c'è una tabella.
Ad ogni pattern ha associato il valore zero e uno. Come farebbe in qual caso a determinare di quale carattere si tratta?
Anche se l'esempio che propone è troppo generico.
vendettaaaaa
18-01-2012, 11:14
http://www.webalice.it/capaso/DOCS/RETI_NEURALI/Baldassarre-IntroduzioneAlleRetiNeurali.pdf
a pagina 12 c'è una tabella.
Ad ogni pattern ha associato il valore zero e uno. Come farebbe in qual caso a determinare di quale carattere si tratta?
Anche se l'esempio che propone è troppo generico.
Quell'esempio usa la funzione soglia, che restituisce solo 0 o 1.
Ad esempio: se il tuo voto nel compito è minore di 18, restituisci 0 (bocciato), altrimenti restituisci 1 (promosso).
Ovviamente non puoi usare quella per riconoscere 26 caratteri.
Questa domanda m'ha fatto sorgere un dubbio: cosa studi e a che anno sei? Qual è la tua preparazione nelle scienze matematiche?
sempre molto chiaro,
però resto col dubbio se una volta che ho definito i miei pattern, i parametri w che sperimento su ogni pattern dei 26 che ho creato devono fornirmi gli output che ho imposto io: non so se riesco a farmi capire.
Cioè, riesco a trovare i vari w1, w2, w3 che moltiplicati per i 64 bit di ogni patter e per tutti i 26 pattern mi forniscono in output i risultati da me attesi?
Di sicuro credo che esistano delle "w" particolari che riescono a soddisfare tutti gli output ma chiedo conferma.
Tale domanda ha il seguente significato:
se dai 26 pattern trovo delle w1, w2, wn che in un certo senso soddisfano tutti gli output, quando mi ritroverò a leggere un input che non conosco, sarà sufficiente, credo, fare i vari prodotti, determinare l'output corrispondente e attraverso questo determinare di quale carattere si tratta; sempre che una tale verifica sia sufficiente a farmi capire di quale carattere si tratta. Qui credo di aver inserito un altro piccolo dubbio e cioè, credo non sia sufficiente basarsi sull'output per stabilire di quale carattere viene dato in input.
grazie
Una rete neurale non e' altro che una scatola nera per approssimare una funzione f(w,x) dove w sono i pesi e x il tuo input ( i tuoi bit). Tu hai un problema di classificazione per cui possiamo dire che devi mappare bitmap in un qualcosa che ti dica quale lettera e'. Una soluzione puo' essere quella di usare un vettore di lunghezza 'm', dove un 1 all'i-esima posizione (e 0 nel resto) indica che si tratta della i-esima lettera: [1,0,0,0,0,0,0,0,0,0,...] indica una 'a', alla 'b' corrisponde [0,1,0,...] eccetera.
(considero intervalli [0,1] invece che {0,1} perche' gli algoritmi piu' noti per l'apprendimento approssimano funzioni continue su R^n)
Quindi potremmo dire che la tua f e'
f : [0,1]^64 -> [0,1]^21 (limitandosi a sole 21 lettere)
Lo scopo dell'addestramento e' trovare dei pesi per i quali sia il piu' possibile vero che f('a') = [1,0,0,...], f('b')=[0,1,0,0,...] etc.
Nota che tu non sei interessato ad avere una corrispondenza perfetta. Quel che ti interessa in realta' e' che si comporti bene "in generale" anche con dei caratteri che non corrispondono correttamente con nessuno degli input che conosci. (E' un discorso che merita un discorso a se', ma l'idea e' che piu' addestri la rete affinche' riproduca gli input noti, piu' e' difficile che si comporti bene con gli input sconosciuti)
Supponi a questo punto che tu abbia trovato delle w opportune. Come capisci a quale lettera corrisponde un dato input ? Supponendo che il tuo vettore sia y=[y_1,y_2,...], trovi quale vettore tra [1,0,0,...], [0,1,...] e' il piu' "vicino" all'output ottenuto.
Quale distanza considerare dipende dal contesto, un esempio puo' essere la distanza euclidea, un altro potrebbe essere semplicemente il vettore corrispondente alla componente piu' elevata.
Quell'esempio usa la funzione soglia, che restituisce solo 0 o 1.
Ad esempio: se il tuo voto nel compito è minore di 18, restituisci 0 (bocciato), altrimenti restituisci 1 (promosso).
Ovviamente non puoi usare quella per riconoscere 26 caratteri.
Questa domanda m'ha fatto sorgere un dubbio: cosa studi e a che anno sei? Qual è la tua preparazione nelle scienze matematiche?
non è una questione di preparazione o meno, l'uni l'ho finita da un pezzo; è che sto studiando "sistemi intelligenti" attraverso qualche pdf trovato qua e la; comunque sono tutti ragionamenti, tutto sommato semplici una volta compresi, che vedo per la prima volta.
Comunque una volta tanto ho voluto avvicinarmi ad un argomento per me nuovo, attraverso un approcio pratico, saltando tutti i preliminari :D ecco la leggera confusione che noti tu.
ciao
vendettaaaaa
18-01-2012, 15:49
non è una questione di preparazione o meno, l'uni l'ho finita da un pezzo; è che sto studiando "sistemi intelligenti" attraverso qualche pdf trovato qua e la; comunque sono tutti ragionamenti, tutto sommato semplici una volta compresi, che vedo per la prima volta.
Comunque una volta tanto ho voluto avvicinarmi ad un argomento per me nuovo, attraverso un approcio pratico, saltando tutti i preliminari :D ecco la leggera confusione che noti tu.
ciao
Ah ok, ero solo rimasto perplesso dal fatto che non avessi riconosciuto la funzione soglia, non volevo insinuare nulla :)
Ah ok, ero solo rimasto perplesso dal fatto che non avessi riconosciuto la funzione soglia, non volevo insinuare nulla :)
figurati :)
Ma non ci saranno dei pattern già belli e fatti con delle w già belle e calcolate per fare degli esperimenti?
vendettaaaaa
18-01-2012, 17:26
figurati :)
Ma non ci saranno dei pattern già belli e fatti con delle w già belle e calcolate per fare degli esperimenti?
Lascio a te l'onere di trovarli :D
ad ogni modo
w1*x2 + w2*x2 + w3*x3 = risultato 1
w1*x4 + w2*x5 + w3*x6 = risultato 2
etc.....
sono un modo per evitare di scrivere una infinità di pattern giusto?
Se riuscissi a generare da una griglia 8x8 tutti i modi possibili di scrivere la lettera A maiuscola, potrei anche fare una verifica bit a bit e determinare se si tratta o meno della lettera A senza usare i pesi w giusto?
Ma se i casi in cui scrivere la lettera A diventano esageratamente tanti è meglio ricorrere all'uso dei pesi che almeno forniscono un risultato che si avvicina al carattere che stiamo cercando.
Desidererei solo una conferma, grazie :D
vendettaaaaa
19-01-2012, 17:48
ad ogni modo
w1*x2 + w2*x2 + w3*x3 = risultato 1
w1*x4 + w2*x5 + w3*x6 = risultato 2
etc.....
sono un modo per evitare di scrivere una infinità di pattern giusto?
Se riuscissi a generare da una griglia 8x8 tutti i modi possibili di scrivere la lettera A maiuscola, potrei anche fare una verifica bit a bit e determinare se si tratta o meno della lettera A senza usare i pesi w giusto?
Ma se i casi in cui scrivere la lettera A diventano esageratamente tanti è meglio ricorrere all'uso dei pesi che almeno forniscono un risultato che si avvicina al carattere che stiamo cercando.
Desidererei solo una conferma, grazie :D
Non avrebbe senso fare la verifica bit a bit: se si sbaglia anche di un solo bit la A noi umani la riconosceremmo ma il programma no. Mentre la rete neurale direbbe "è una A con buona probabilità".
Cmq ovviamente dovresti prima farti un programma che ti permetta di disegnare i caratteri col mouse, come su quel sito là, e poi ci metti niente a fare una 10ina di pattern per lettera.
Non avrebbe senso fare la verifica bit a bit: se si sbaglia anche di un solo bit la A noi umani la riconosceremmo ma il programma no. Mentre la rete neurale direbbe "è una A con buona probabilità".
Cmq ovviamente dovresti prima farti un programma che ti permetta di disegnare i caratteri col mouse, come su quel sito là, e poi ci metti niente a fare una 10ina di pattern per lettera.
ciao,
il problema non è creare i pattern, ma è capire che i pesi w sono un modo elegante, se così si può dire, che ti evita di costruire infiniti pattern per confronti biti a bit e relativi output coi quali poi istruire la tua rete.
Ovviamente i pattern vanno costruiti con una certa logica giusto?
Altrimenti potrebbe accadere che la rete non "apprenda nulla" vero?
vendettaaaaa
19-01-2012, 21:13
ciao,
il problema non è creare i pattern, ma è capire che i pesi w sono un modo elegante, se così si può dire, che ti evita di costruire infiniti pattern per confronti biti a bit e relativi output coi quali poi istruire la tua rete.
Ovviamente i pattern vanno costruiti con una certa logica giusto?
Altrimenti potrebbe accadere che la rete non "apprenda nulla" vero?
Non ho ben capito...l'unica logica che i pattern devono avere è: se il disegno assomiglia ad una A, dico alla rete che quella è una A; se assomiglia ad una e le dico che è una e, e così via.
Cmq sì sono un modo elegante ma soprattutto flessibile per non dover fare bit per bit.
ciao,
il problema non è creare i pattern, ma è capire che i pesi w sono un modo elegante, se così si può dire, che ti evita di costruire infiniti pattern per confronti biti a bit e relativi output coi quali poi istruire la tua rete.
Nel caso di una bitmap no, ma in generale gli input potrebbero anche essere infiniti.
Il problema e' analogo a quello della regressione: ho una serie di coppie (x,y) e io voglio trovare la retta (parabola etc.) che "meglio rappresenta" quei punti.
Nel caso di una bitmap no, ma in generale gli input potrebbero anche essere infiniti.
Il problema e' analogo a quello della regressione: ho una serie di coppie (x,y) e io voglio trovare la retta (parabola etc.) che "meglio rappresenta" quei punti.
ciao,
però nel caso degli input io ho stringhe di bit dove ogni bit della stringa è per me una x e come risultato ho una y risultato delle xi * wi
xi = singoli bit in ingresso
wi = pesi calcolati in precedenza cioè quelli di quando ho addestrato la rete coi miei pattern campione
ciao,
però nel caso degli input io ho stringhe di bit dove ogni bit della stringa è per me una x e come risultato ho una y risultato delle xi * wi
xi = singoli bit in ingresso
wi = pesi calcolati in precedenza cioè quelli di quando ho addestrato la rete coi miei pattern campione
Esatto, ma concettualmente e' la stessa cosa. Nel tuo caso le x sono vettori di R^m, le y vettori di R^n. E le w sono parametri della funzione da trovare, cosi' come a e b lo sono nel caso della retta y=ax+b
Esatto, ma concettualmente e' la stessa cosa. Nel tuo caso le x sono vettori di R^m, le y vettori di R^n. E le w sono parametri della funzione da trovare, cosi' come a e b lo sono nel caso della retta y=ax+b
ciao,
spero che la mia domanda abbia un senso, mi è sorta osservando i grafici alla fine dell'articolo a questo link http://stor.altervista.org/informatica/nn/nn.htm
Se non ho capito male, mostra l'apprendimento della rete dopo un certo numero di passaggi ed alla fine, la rete "ricalca" quasi fedelmente una sinusoide.
Chiaramente parlando di riconoscere caratteri, questo è l'esperimento che per ora mi interessa, avrebbe senso tracciare una funzione o, la funzione di apprendimento?
Sempre se la domanda ha senso: che forma avrebbe?
Quali sarebbero le x e le y dei singoli punti della funzione?
quella dell'esempio è un problema di regressione con un input 1-dimensionale, quello dei tuoi caratteri è un problema di classificazione HxW-dimensionale, non lo puoi plottare. oltre le tre dimensioni la cosa diventa complicatuccia :)
una curiosità: da dove viene la scelta delle reti neurali come algoritmo di apprendimento?
modifica per spiegare meglio:
a ogni immagine corrisponde un punto nello spazio che è dato fissando tutti i suoi pixel.: su ogni asse avresti un pixel con il suo valore (che può essere binario ma tratti comunqe come un reale).
Da lì il problema: hai tante dimensioni (assi) quanti i pixel
quella dell'esempio è un problema di regressione con un input 1-dimensionale, quello dei tuoi caratteri è un problema di classificazione HxW-dimensionale, non lo puoi plottare. oltre le tre dimensioni la cosa diventa complicatuccia :)
una curiosità: da dove viene la scelta delle reti neurali come algoritmo di apprendimento?
modifica per spiegare meglio:
a ogni immagine corrisponde un punto nello spazio che è dato fissando tutti i suoi pixel.: su ogni asse avresti un pixel con il suo valore (che può essere binario ma tratti comunqe come un reale).
Da lì il problema: hai tante dimensioni (assi) quanti i pixel
ciao,
tutto nasce da una ricerca che sto facendo allo scopo di automatizzare un sistema piuttosto complesso e non è detto che ci si riesca fino in fondo.
Sostanzialmente la rappresentazione sotto forma di funzione a me serviva per capire nei seguenti termini:
ho un problema fatto così, cioè la cui funzione è questa, nell'esempio è una sinusoide.
Nel problema che voglio risolvere io non ho alcuna funzione come riferimento e quindi addestrerei la mia rete senza alcun riferimento.
Da questi punti sollevati allora è nato il dubbio di come si potrebbe rappresentare graficamente sotto forma di funzione l'acquisizione di caratteri o magari altri problemi.
Da quello che mi dici però mi pare di capire che caratteri o sinusoidi sono problemi completamente diversi che vanno trattati in modi comletamente differenti: è così ?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.