|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
[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 |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
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 Ultima modifica di misterx : 10-01-2012 alle 11:29. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
|
Quote:
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
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
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... |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
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. Ultima modifica di misterx : 10-01-2012 alle 19:50. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
se vi spossono interessare due articoli illuminanti
http://www.webalice.it/capaso/DOCS/R...etiNeurali.pdf http://info.iet.unipi.it/~lazzerini/sisd/Reti.pdf |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
edit
Ultima modifica di misterx : 13-01-2012 alle 15:13. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
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 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
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 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 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.
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
ma per il risultato atteso ad esempio da 08800 cosa imponi? |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
|
Quote:
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)
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
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 |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
|
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
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
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 |
|
|
|
|
|
|
#16 | ||
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
|
Quote:
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 Quote:
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
c'è una cosa che non mi è chiara nell'esempio a pagine 13 di questo pdf http://www.webalice.it/capaso/DOCS/R...etiNeurali.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 |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: May 2005
Città: Trieste
Messaggi: 2287
|
Quote:
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)
__________________
neo mini v2 / asus strix z490i / 10600k@? / uh12s / rx6700xt / 32gb ddr4@3200 / sandisk 250 + asenno 1tb / lenovo g34w
trattative concluse : tante... |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3741
|
Quote:
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 |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Jan 2012
Messaggi: 1267
|
Quote:
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. Ultima modifica di vendettaaaaa : 17-01-2012 alle 19:44. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:31.




















