Dunque, mi prendi un attimo impreparato, perchè è da molto tempo che non metto mano al codice e alle reti neurali, sebbene in linea di massima qualche indicazione te la posso dare...
Innanzitutto, per il training servono più esempi eterogenei... Infatti, se volessi insegnare una funzione come y=Sin(x) (difficile da realizzare con una single layer), non basterebbe avere la coppia di input/output (0,0) e (pigreco/2,1), ma servirebbero valori abbastanza casuali tra 0 e 2pigreco...
Quindi serve una rete "ben progettata" (e qui non ci sono regole fisse) ed un insieme eterogeneo di input. A questo punto si passa all'addestramento.
Dove si conservano i risultati? Semplice, sui pesi stessi, che vengono modificati sulla base del "gradiente di errore" in modo da convergere lentamente ai valori di output desiderati. In genere, non conviene una modifica "pesante" dei pesi, ma conviene agire per piccole modifiche degli stessi, ripetendo il training più volte.
Quando finisce l'allenamento della rete? Quando la misura dell'errore (differenza output desiderato e output ottenuto) è ritenuta "soddisfacente". Raramente si raggiunge l'errore nullo, anche perchè la rete tende a "memorizzare" i risultati e non ad apprendere la funzione, quindi occorre non ripassare troppe volte gli esempi e lasciare un margine di errore...
Quindi, ricapitolando, crei un training set (anche casuale), addestri la rete in un ciclo, ad ogni "passata" aggiorni i pesi della stessa rete, e ripeti fino a quando l'errore diventa "accettabile"...