2017-03-26 6 views
0

Während ich über neuronales Netzwerk mit Tensorflow studiere, bekam ich eine Frage über tf.nn.conv2D (x, W, schreitet = [1, 1, 1, 1], padding = 'SAME')Tensorflow - Hat sich der Gewichtswert in tf.nn.conv2D() geändert?

Wenn ich den Bildwert x und den Gewichtswert W (initialisiert von tf.truncated_normal (shape, stddev = 0.1)) eingegeben habe, weiß ich, dass es einen Wert zurückgibt, der das Ergebnis von tf.nn.conv2D() ist.

Aber meine Frage ist, wenn tf.nn.conv2D() heißt, ändert es Gewichtswert?

Wenn es den Wert von Gewicht ändert, wie funktioniert es? Tatsächlich, wenn ich Gewichtswert drucke, ändert es sich. Aber ich weiß nicht warum ... Meine Annahme ist, dass der Wert W eine Art von Call-by-Reference ist, also während der Berechnung von tf.nn.conv2D() der Wert W geändert wird. Ist es richtig?

+0

Können Sie Ihren Code posten, wie/wann Sie Ihre Gewichtswerte überprüfen und welcher Teil für Verwirrung sorgt? Gewichte in CNN werden erst nach dem Rückwärtsdurchlauf aktualisiert. Wenn also "conv2D" während des Trainings tatsächlich ausgewertet wird, faltet es den Kernel (Gewichte) über die Eingabe, um Feature-Maps (keine Gewichte) zurückzugeben - dies ist der Vorwärtsdurchlauf. Dann wird ein Rückwärtsdurchlauf ausgeführt, um Gradienten zu bewerten und die Gewichte tatsächlich zu aktualisieren – Simon

Antwort

1

Der Tensorflow-Code ist nicht wie Ihre herkömmliche Programmiersprache. Zuerst wird ein Diagramm aus dem Code erstellt (die Tensorboard visualisiert werden kann verwenden, und aktualisieren Sie dann Regeln verwenden backpropagation berechnet, die intern umgesetzt wurde

Wenn Sie schreiben:.

h = tf.nn.conv2D(x, W, strides=[1, 1, 1, 1], padding='SAME') 

es schafft eine Faltungs Ebene in Ihrem neuronalen Netzwerk, die Faltung (http://cs231n.github.io/convolutional-networks/) auf Ihrer Eingabematrix durchführt und das Ergebnis in h ausgibt Nun ist der ganze Zweck der Durchführung solcher Faltungen, einige lokale Muster wie vertikale oder horizontale Kanten im Bild zu identifizieren. Zum Beispiel eine Gewichtsmatrix W wie

W = [[0,1,0],[0,1,0],[0,1,0]] 

würde vertikale Kanten im Bild identifizieren. Da jedoch W wurde zufällig hier initialisiert

W = tf.Variable(tf.truncated_normal(shape, stddev=0.1))) 

würde jedes Muster nicht in der Lage sein, am Anfang zu finden. Dies wird durch Backpropagation gelöst.

Beim Zug Ihr neuronales Netzwerk auf einem markierten Daten, bei jedem Schritt die Matrix W so aktualisiert wird, dass die Ableitung des E w.r.t W Fehler reduziert wird. Sie können nicht sehen, dass es in Ihrem Code passiert, da die Backpropagation intern in Tensorflow implementiert ist und Sie nur Code für den Weiterleitungsdurchlauf schreiben müssen. Wenn Sie W als

W = tf.Variable(tf.truncated_normal(shape, stddev=0.1)),trainable=False) 

definiert wird es nicht aktualisiert werden, aber dann wird der gesamte Zweck der Parameter Ausbildung würden besiegt werden.

Ich empfehle Ihnen, durch http://neuralnetworksanddeeplearning.com gehen, um zu verstehen, wie neuronale Netzwerke arbeiten, bevor Sie mit Tensorflow fortfahren.

Verwandte Themen