die Summe über eine Liste von Tensoren in tensorflow
Ich habe ein tiefes neuronales Netzwerk, in dem sich die GEWICHTE zwischen den Schichten sind in einer Liste gespeichert.
layers[j].weights
Ich will incluse dem Grat Strafe in meine Kosten-Funktion. Ich brauche dann etwas wie
tf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))
d.h. das Quadrat der Summe aller GEWICHTE.
Insbesondere die GEWICHTE sind wie folgt definiert:
>>> avs.layers
[<neural_network.Layer object at 0x10a4b2a90>, <neural_network.Layer object at 0x10ac85080>, <neural_network.Layer object at 0x10b0f3278>, <neural_network.Layer object at 0x10b0eacf8>, <neural_network.Layer object at 0x10b145588>, <neural_network.Layer object at 0x10b165048>, <neural_network.Layer object at 0x10b155ba8>]
>>>
>>> avs.layers[0].weights
<tensorflow.python.ops.variables.Variable object at 0x10b026748>
>>>
Wie kann ich das machen, dass in tensorflow ?
- Ich denke, dass müssen Sie erstellen eine neue tensor aus diesen gewichten und zu verwenden, dass in die Kosten-Gleichung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den standard-Weg, um die Summe einer Liste von Tensoren ist die Verwendung der
tf.add_n()
Betrieb, der eine Liste von Tensoren (jeweils mit der gleichen Größe und Form) und erzeugt eine einzelne tensor mit die Summe.Für das bestimmte problem, das Sie haben, gehe ich davon aus, dass jeder
layers[j].weights
könnte haben eine unterschiedliche Größe. Deshalb müssen Sie reduzieren jedes element unten, um eine Skalare, bevor summieren, z.B. mit demtf.nn.l2_loss()
Funktion selbst:(Beachten Sie jedoch, dass, wenn die Werte addiert werden, sind groß, können Sie feststellen, es effizienter zu berechnen eine Folge von
tf.add()
Operationen, da TensorFlow hält die Werte der einzelnenadd_n
Argumente im Speicher, bis alle von Ihnen berechnet wurden. Eine Kette vonadd
ops können einige der Berechnung zu früher erfolgen.)sum()
ist eine kürzere äquivalent zu einer Sequenz von tf.hinzufügen ops.Den
tf.nn.l2_loss()
Funktion liefert einen tensor mit 0 Dimensionen.Aber es ist schön, nicht brauchen, um manuell anwenden, die jedem Gewicht-tensor, so dass die Speicherung der Gewichts-Tensoren in einer Liste ist eine Möglichkeit, um das problem zu lösen (wie @mrry erwähnt).
Aber anstatt dass Sie schreiben, dass sich jedes mal, was Sie tun können, verwenden Sie die folgende Funktion
In deinem Fall würde das so Aussehen:
Auch
tf.nn.l2_loss()
implizit gilt die Quadratur-operation für die Werte als auch die Multiplikation aller quadrierten Werte von 1/2 , so waren Sie so etwas wietf.nn.l2_loss(layers[j].weights**2 for j in range(self.n_layers))
Sie wäre eigentlich die Anhebung der GEWICHTE für die 4. macht. Als Ergebnis Ihrer Ableitung dieser Verlust Begriff wäre seltsam: wäre es nicht Abbrechen 1/2 1 (aber implizit werden die Verdopplung der β) und die GEWICHTE würde cubed.