首页 文章

通过神经网络分类器计算图像显着性

提问于
浏览
3

假设我们有一个卷积神经网络经过训练,可以在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 回答

  • 4

    要计算渐变,您不需要使用优化器,也可以直接使用tf.gradients .
    使用此功能,您可以直接计算 output 相对于图像 input 的渐变,而优化程序 compute_gradients 方法只能计算渐变 with respect to Variables .

    tf.gradients 的另一个优点是您可以指定要反向传播的输出的渐变 .


    所以这里是如何获得关于 output[1, 1] 的输入图像的渐变:

    • 我们必须将输出渐变设置为 0 除了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.]]
    

相关问题