假设我们有一个卷积神经网络经过训练,可以在Tensor-Flow中对(w.l.g.灰度)图像进行分类 .
给定训练的网络和测试图像,可以追踪它的哪些像素是显着的,或者哪些像素对图像的输出分类负有最大责任 . Theano中的一个很好的解释和实现细节在article中给出 .
假设对于与输入图像直接相关的第一层卷积,我们确实具有每个卷积核-wrt的参数的梯度 . 分类功能 .
How can one propagate the gradient back to the Input layer, so to compute a partial derivative on every pixel of the image?
-
传播和累积回梯度,会给我们带来显着的像素(它们是那些具有大幅度导数的像素) .
-
找到渐变wrt . 第一层的内核,到目前为止我做了:
-
用输出层运算符替换了常用的损失运算符 .
-
使用了"compute_gradient"函数,
总而言之,它看起来像:
-
opt = tf.train.GradientDescentOptimizer(1)
-
grads = opt.compute_gradients(输出)
-
grad_var = [(毕业1)为毕业生毕业]
-
g1 = sess.run([grad_var [0]])
其中,“输出”是NN输出层的最大值 . 并且g1是(k,k,1,M)张量,因为我在第一层使用M:k x k卷积核 .
现在,我需要找到在每个输入像素上传播g1的正确方法,以计算它们的导数wrt . 输出 .
1 回答
要计算渐变,您不需要使用优化器,也可以直接使用tf.gradients .
使用此功能,您可以直接计算
output
相对于图像input
的渐变,而优化程序compute_gradients
方法只能计算渐变 with respect to Variables .tf.gradients
的另一个优点是您可以指定要反向传播的输出的渐变 .所以这里是如何获得关于
output[1, 1]
的输入图像的渐变:0
除了indice[1, 1]