2017-02-22 2 views
1

Ich möchte ein Netzwerk erstellen, das bestimmte feste Verbindungen zwischen den Schichten hat. Zum Beispiel versuchte Sparsely connected neural networkWie erstellt man ein benutzerdefiniertes verbundenes neuronales Netzwerk mit Tensorflow?

ich in Funktionen in Tensorflow suchen, aber ich fand nur dichte Netzwerke mit regularizers, die, wie ich will nicht funktionieren.

Wenn es im Tensorflow nicht möglich ist, schlagen Sie bitte eine andere Bibliothek vor, die verwendet werden kann. Vielen Dank!

Antwort

2

Sie können immer einen Workaround finden. Angenommen, ein Layer ist y = xW (Wx ist auch korrekt), aber Sie möchten, dass einige der Einträge in W immer Nullen sind. Sie können es tun spaltenweise:

Für Spalte i (oder Element i seit y ein Vektor) des Ausgangs, y_i = x * D_i * W_i. Die Matrix D_i ist eine konstante Diagonalmatrix (tf.constant, tf.diag), die steuert, welches Element Nullen wäre.

Dann können Sie tf.concat verwenden, um alle y_i mit Matrix Y zu kombinieren.

Sie können dies in eine Funktion abstrahieren, deren Unterschrift wie folgt aussehen könnte: def sparse_layer(input_layer, gates_matrix, activation_f, ...), die die Ausgabeschicht zurückgibt.

+1

Danke! Ich werde versuchen, dies zu implementieren und die Ergebnisse zu sehen. Eine Frage aber, wenn wir die Gewichte zwingen, auf Null zu gehen, wie wirkt sich die Rückübertragung auf diese Gewichte dann aus? Die ideale Situation in meinem Fall wäre, dass die Gradienten nicht zu den Gewichten zurückkehren, die Null sind. – navyajapani

+0

Diese Methode funktioniert nicht. Auf diese Weise versucht das Netzwerk immer noch, die Gewichte auf der Verbindung zu trainieren, die nicht dort sein sollen. Wir brauchen ein Netzwerk, in dem die Gewichte für die verbundenen Kanten die einzigen zu trainierenden Variablen sind. Irgendwelche Vorschläge? – navyajapani

+0

@navyajapani Lassen Sie uns den Ausdruck erweitern und wir haben 'y_i = x * D_i * W_i = [.... x ....] * diag ([.... d ....]) * transponieren ([. ... w ....]) '. Wenn 'd = 0', dann 'y_i = [.... 0 ....] * transponieren ([.... w ...]) = .... + 0 * w + .... '. Also hat das Element "w" in "W" einen Einfluss auf die Ausgabe, so dass der Gradient in Bezug auf "w" 0 ist und daher "w" nicht trainiert wird, obwohl er seinen Anfangswert haben kann. – yuefengz

Verwandte Themen