【问题标题】:Computing Image Saliency via Neural Network Classifier通过神经网络分类器计算图像显着性
【发布时间】:2016-11-01 19:45:24
【问题描述】:

假设我们有一个经过训练的卷积神经网络,可以在 Tensor-Flow 中对图像进行分类(w.l.o.g. 灰度)。

给定经过训练的网络和测试图像,我们可以追踪其中哪些像素是显着的,或者“等效地”哪些像素对图像的输出分类负有最大责任。这个article 给出了Theano 中的一个很好的解释和实现细节。

假设对于与输入图像直接相关的第一层卷积,我们确实有每个卷积核参数的梯度。分类功能。

如何将梯度传播回输入层,从而计算图像每个像素的偏导数?

  1. 向回传播和累积梯度,将为我们提供显着像素(它们是那些具有较大量导数的像素)。

  2. 找到梯度wrt。第一层的内核,到目前为止我做到了:

    1. 将通常的损失算子替换为输出层算子。
    2. 使用了“compute_gradient”函数,

总而言之,它看起来像:

  • opt = tf.train.GradientDescentOptimizer(1)
  • grads = opt.compute_gradients(输出)
  • grad_var = [(grad1) for grads]
  • g1 = sess.run([grad_var[0]])

其中,“输出”是神经网络输出层的最大值。 g1, 是 (k, k, 1, M) 张量,因为我在第一层使用了 M: k x k 卷积核。

现在,我需要找到在每个输入像素上传播 g1 的正确方法,以计算它们的导数 wrt。输出。

【问题讨论】:

    标签: classification tensorflow gradient


    【解决方案1】:

    计算梯度不需要使用优化器,直接使用tf.gradients即可。
    使用此函数,您可以直接计算output 相对于图像input 的梯度,而优化器compute_gradients 方法只能计算相对于变量的梯度

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


    下面是如何获取输入图像相对于output[1, 1] 的梯度:

    • 我们必须将输出梯度设置为0,除了索引[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.]]
    

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 2017-12-21
      • 2016-08-26
      • 2012-10-08
      • 2017-10-07
      • 2021-12-25
      • 2012-07-15
      • 2019-10-04
      • 2017-08-22
      相关资源
      最近更新 更多