2013-03-06 13 views
5

Ho una rete neurale con l'architettura 1024, 512, 256, 1 (il livello di input ha 1024 unità, il livello di output ha l'unità 1, ecc.). Vorrei addestrare questa rete utilizzando uno degli algoritmi di ottimizzazione in scipy.optimize.Gestione dei problemi di memoria nella rete con molti pesi

Il problema è che questi algoritmi si aspettano che i parametri di funzione vengano dati in un vettore; questo significa che, nel mio caso, devo srotolare tutti i pesi in un vettore di lunghezza

1024*512 + 512*256 + 256*1 = 655616 

Alcuni algoritmi (come fmin_bfgs) hanno bisogno di utilizzare matrici di identità, in modo da effettuare una chiamata come

I = numpy.eye(655616) 

che, non molto sorprendentemente, produce un MemoryError. C'è modo per me di evitare di dover srotolare tutti i pesi in un unico vettore, a meno di adattare gli algoritmi in scipy.optimize alle mie esigenze?

+0

Wow, ci sono molti pesi per adattarsi. (+1) – NPE

+0

@NPE Devo ammettere che non so davvero cosa sto facendo. Mi sto allenando su immagini di dimensioni '32x32'. Devo rendere le immagini ancora più piccole? –

+0

Poi ancora, riducendo la dimensione delle immagini a '16x16' e usando l'architettura' 256, 128, 1', avrei ancora avuto e srotolato il vettore di peso di lunghezza '32896'. –

risposta

0

Penso che la mappatura della memoria risolva il problema. Suggerisco di usare numpy.memmap, che è ottimizzato per gli array di numpy. Si noti che mentre la mappatura della memoria può essere molto veloce, è necessario tenere d'occhio il numero thrashing.

Per la cultura generale, il modulo mmap è una libreria di mappatura della memoria più generale inclusa nella libreria standard.

1

Non provare ad adattare i pesi a un NN utilizzando L-BFGS. Non funziona particolarmente bene (vedi le prime pubblicazioni di Yann LeCun), e poiché si tratta di un metodo di secondo ordine, tenterai di approssimare l'Hessian, che per quel numero di pesi è una matrice di 655.000 x 650.000: questo introduce un sovraccarico delle prestazioni che semplicemente non sarà giustificato.

La rete non è così profonda: c'è una ragione per cui stai evitando il back-punt standard? Questa è solo la discesa del gradiente se si ha accesso a un'implementazione di una libreria, i gradienti sono economici per il calcolo e poiché si tratta solo di un metodo di primo ordine, non si avrà lo stesso sovraccarico di prestazioni.

EDIT:

Backpropogation significa che la regola di aggiornamento per w_i nella fase t è:

w_i (t) = w_i (t-1) - \ alpha (dError/dw_i)

Inoltre, ti sei imbattuto nel motivo per cui le persone in visione usano spesso Convolutional NNs: la connettività sparsa riduce in modo massiccio la dimensione del vettore di peso in cui hai un neurone per pixel.

+0

+1 per far notare che il problema della memoria è causato dall'assiano. Non evito il backprop standard, utilizzo il backprop per calcolare il gradiente dell'errore wrt. i pesi della rete. Ho ancora bisogno di un algoritmo di ottimizzazione in grado di attraversare la superficie dell'errore (utilizzando il gradiente calcolato con backprop) per trovare il minimo. –

+0

Backprop, almeno come vorrei usare il termine, significa usare la discesa del gradiente.Puoi farlo stocasticamente (ogni esempio a turno) o in gruppo. Cioè il tuo aggiornamento è una dimensione del passo moltiplicata per il negativo del gradiente. –

+0

Ho modificato la mia risposta perché mi è venuto in mente un altro utile tidbit: per questo motivo vengono utilizzate reti convoluzionali. –

Problemi correlati