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

标签 classification tensorflow gradient

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

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

假设对于与输入图像直接链接的第一层卷积,我们确实有每个卷积核-wrt ​​参数的梯度。分类函数。

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

  • 传播和累积梯度,会给我们显着像素(它们是那些具有大的幅度导数的像素)。
  • 找到梯度wrt。第一层的内核,到目前为止我做了:
  • 用输出层算子替换了通常的损失算子。
  • 使用了“compute_gradient”函数,

  • 总而言之,它看起来像:
  • opt = tf.train.GradientDescentOptimizer(1)
  • grads = opt.compute_gradients(输出)
  • grad_var = [(grad 1 ) for grad in grad]
  • g1 = sess.run([grad_var[0]])

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

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

    最佳答案

    要计算梯度,您不需要使用优化器,您可以直接使用 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.]]
    

    关于classification - 通过神经网络分类器计算图像显着性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38110807/

    相关文章:

    python - Python 中的一维马氏距离

    html - 创建跨浏览器的背景渐变

    android - 如何保存图像分类模型并将其用于 android

    ios - 在iOS中出现之前添加按钮渐变

    css - 为什么在应用背景渐变时边框颜色会反转?

    r - 基于剪枝规则的分类树(PART算法)

    machine-learning - 当存在多个正确标签时,如何训练机器学习分类模型?

    machine-learning - Weka 中级联分类器的错误方法

    python - 我的分类器损失很大,准确率始终为 0

    python - 如何编写高效的自定义 Keras 数据生成器