2016-04-05 14 views
20

Einige Anwendungsfälle für neuronale Netzwerke erfordern, dass nicht alle Neuronen zwischen zwei aufeinanderfolgenden Schichten verbunden sind. Für meine neuronale Netzwerkarchitektur brauche ich eine Schicht, in der jedes Neuron nur Verbindungen zu einigen vorgegebenen Neuronen in der vorherigen Schicht hat (an irgendwelchen willkürlichen Stellen, nicht mit einem Muster wie einer Faltungsschicht). Dies ist erforderlich, um Daten in einem bestimmten Diagramm zu modellieren. Ich muss diese "Sparse" Schicht in Theano implementieren, aber ich bin nicht an die Theano Art der Programmierung gewöhnt.Implementieren spärlicher Verbindungen im neuronalen Netzwerk (Theano)

Es scheint, dass die effizienteste Art der Programmierung spärlicher Verbindungen in Theano wäre, theano.tensor.nnet.blocksparse.SparseBlockGemv zu verwenden. Eine Alternative wäre eine Matrixmultiplikation, bei der viele Gewichtungen auf 0 gesetzt sind (= keine Verbindung), aber das wäre sehr ineffizient im Vergleich zu SparseBlockGemv, da jedes Neuron nur mit 2-6 Neuronen in der vorherigen Schicht von ~ 100000 verbunden ist Neuronen. Außerdem würde eine Gewichtsmatrix von 100000x100000 nicht auf meinen RAM/GPU passen. Könnte jemand daher ein Beispiel für die Implementierung von Sparse-Verbindungen mit der Methode SparseBlockGemv oder einer anderen recheneffizienten Methode bereitstellen?

Ein perfektes Beispiel wäre, die MLP Theano Tutorial mit einer zusätzlichen Schicht nach der versteckten Schicht (und vor softmax) zu erweitern, wobei jedes Neuron nur Verbindungen zu einer Untergruppe von Neuronen in der vorherigen Schicht hat. Aber auch andere Beispiele sind willkommen!

Bearbeiten: Beachten Sie, dass die Schicht in Theano implementiert werden muss, da es nur ein kleiner Teil einer größeren Architektur ist.

+0

Ich bin zu der Erkenntnis gekommen, dass SparseBlockGemv nicht für allgemeine Sparse-Block-Matrix (wie BSR) gedacht ist, sondern für eine Punktoperation über eine große W-Matrix mit nur begrenzter Eingabe/Ausgabe-Kombination. – tdihp

Antwort

1

Die Ausgabe einer vollständig verbundenen Ebene ergibt sich aus dem Skalarprodukt der Eingabe und den Gewichten dieser Ebene. In theano oder numpy können Sie die dot Methode verwenden.

y = x.dot(w) 

Wenn Sie nur haben Verbindungen zu einigen Neuronen in der vorhergehenden Schicht und diese Verbindungen sind vordefiniert Sie so etwas tun könnte:

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

Wo edges[i] die Indizes für Neuronen enthält verbunden i zum Neuron und w[i] die Gewichte dieser Verbindung.

Bitte beachten Sie, dass theano nichts über Layer oder andere High-Level-Details weiß.

Verwandte Themen