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.
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