2016-04-05 30 views
20

Alcuni casi d'uso per le reti neurali richiedono che non tutti i neuroni siano collegati tra due livelli consecutivi. Per la mia architettura di rete neurale, ho bisogno di avere uno strato, in cui ogni neurone ha solo connessioni con alcuni neuroni prespecificati nello strato precedente (in luoghi alquanto arbitrari, non con un modello come uno strato di convoluzione). Questo è necessario per modellare i dati su un grafico specifico. Ho bisogno di implementare questo strato "Sparse" in Theano, ma non sono abituato al modo di programmazione di Theano.Implementazione di connessioni sparse nella rete neurale (Theano)

Sembra che il modo più efficiente di programmare connessioni sparse in Theano sia utilizzare theano.tensor.nnet.blocksparse.SparseBlockGemv. Un'alternativa sarebbe quella di fare moltiplicazione di matrice, dove molti pesi sono impostati su 0 (= nessuna connessione), ma sarebbe molto inefficiente rispetto a SparseBlockGemv dato che ogni neurone è collegato solo a 2-6 neuroni nel livello precedente di ~ 100000 neuroni. Inoltre, una matrice di peso di 100000x100000 non si adatta alla mia RAM/GPU. Qualcuno potrebbe quindi fornire un esempio di come implementare connessioni sparse utilizzando il metodo SparseBlockGemv o un altro metodo computazionalmente efficiente?

Un esempio perfetto sarebbe estendere lo MLP Theano Tutorial con un livello aggiuntivo dopo il livello nascosto (e prima di softmax), dove ogni neurone ha solo connessioni con un sottoinsieme di neuroni nel livello precedente. Tuttavia, altri esempi sono anche benvenuti!

Modifica: Si noti che il livello deve essere implementato in Theano in quanto è solo una piccola parte di un'architettura più grande.

+0

Mi sono reso conto che SparseBlockGemv non è inteso per una matrice di sparse block generale (come BSR), ma per un'operazione di punto su una matrice W ampia con una combinazione di input/output limitata. – tdihp

risposta

1

L'output di un livello completamente connesso è dato dal prodotto punto dell'input e dai pesi di quel livello. In theano o numpy puoi usare il metodo dot.

y = x.dot(w) 

Se avete solo i collegamenti ad alcuni neuroni nello strato precedente e quei collegamenti sono predefiniti si potrebbe fare qualcosa di simile:

y = [x[edges[i]].dot(w[i])) for i in neurons] 

Dove edges[i] contiene gli indici di neuroni collegati a neurone i e w[i] i pesi di questa connessione.

Si prega di notare che theano non conosce gli strati o altri dettagli di alto livello.