2016-06-29 10 views
3

Angenommen, wir haben ein Faltungs-Neuralnetzwerk, das ausgebildet ist, um Bilder (w.l.o.g. Graustufen) zu klassifizieren, in Tensor-Flow.Berechnen der Bildausbeute über den neuralen Netzwerkklassifizierer

Mit dem trainierten Netz und einem Testbild kann man verfolgen, welche Pixel davon besonders ausgeprägt sind, oder "äquivalent", welche Pixel am meisten für die Ausgabeklassifizierung des Bildes verantwortlich sind. Eine nette, Erklärung und Implementierung Details in Theano, sind in dieser article gegeben.

Angenommen, für die erste Faltungsschicht, die direkt mit dem Eingabebild verknüpft ist, haben wir den Gradienten für die Parameter jedes Faltungskerns. die Klassifikationsfunktion.

Wie kann man den Gradienten zurück auf die Input-Ebene übertragen, um so eine partielle Ableitung auf jedem Pixel des Bildes zu berechnen?

  1. Pflanzgut und die Steigung Akkumulieren zurück, würde uns die charakteristischen Pixel (sie diejenigen mit großen in-Helligkeits-Derivat sind).

  2. Um den Gradienten wrt zu finden. die Kerne der ersten Schicht, so weit ich tat:

    1. Ersetzt den üblichen Verlust-Operator mit der Ausgabeebene Operator.
    2. die "compute_gradient" -Funktion,

Alles in allem sieht es so aus:

  • opt = tf.train.GradientDescentOptimizer (1)
  • Gon = opt. compute_gradients (Ausgang)
  • grad_var = [(grad 1) für grad in grad]
  • g 1 = sess.run ([grad_var [0]])

Wo die "Ausgabe" ist die höchste der Ausgabeschicht des NN. Und g1, ist ein (k, k, 1, M) Tensor, da ich M: k x k Faltungskernel auf der ersten Schicht verwendet habe.

Jetzt muss ich den richtigen Weg finden, um g1 auf jedem Eingabepixel zu propagieren, um ihre Ableitung wrt zu berechnen. die Ausgabe.

Antwort

4

Um die Gradienten zu berechnen, müssen Sie keinen Optimierer verwenden, und Sie können tf.gradients direkt verwenden.
Mit dieser Funktion können Sie direkt den Gradienten von output in Bezug auf das Bild input berechnen, während das Optimierer compute_gradients Verfahren nur Gradienten in Bezug auf Variablen berechnen kann.

Der andere Vorteil von tf.gradients ist, dass Sie die Gradienten der Ausgabe angeben können, die Sie zurückpropagieren möchten.


Also hier ist, wie mit Bezug auf output[1, 1] die Gradienten ein Eingangsbildes zu erhalten:

  • wir den Ausgang Gradienten 0 überall, außer bei indice [1, 1]
input = tf.ones([1, 4, 4, 1]) 
filter = tf.ones([3, 3, 1, 1]) 
output = tf.nn.conv2d(input, filter, [1, 1, 1, 1], 'SAME') 

grad_output = np.zeros((1, 4, 4, 1), dtype=np.float32) 
grad_output[0, 1, 1, 0] = 1. 

grads = tf.gradients(output, input, grad_output) 

sess = tf.Session() 
print sess.run(grads[0]).reshape((4, 4)) 
# prints [[ 1. 1. 1. 0.] 
#   [ 1. 1. 1. 0.] 
#   [ 1. 1. 1. 0.] 
#   [ 0. 0. 0. 0.]] 
gesetzt haben