【问题标题】:Get gradient of layer before activation with respect to input picture获取激活前层相对于输入图片的梯度
【发布时间】:2019-12-18 22:43:51
【问题描述】:

目前,我正在进行通用扰动类型的研究,我将使用激活函数之前层的梯度来回溯上次迭代中采用的梯度步骤。 但是,当我尝试使用 K.gradients 提取渐变时,我似乎无法提取正确的内容。

要么我得到一个我不想要的张量,要么我得到 [零]。给定输入图像,我想要的是倒数第二层的确切梯度。这是我目前拥有的:

f_image = np.array(model.predict(image)).flatten()
I = (np.array(f_image)).flatten().argsort()[::-1]
I = I[0:num_classes]

pert_image = image
gradients = np.asarray(grads(pert_image,I))

这里的 grads 应该是梯度函数以获得精确的梯度。当我使用以下代码时,我得到一个张量:

gradients = K.gradients(model.layers[-2].output, model.layers[0].input)[0]

其中输出是 I,在进行激活分类之前影响最大,输入是扰动图像,从原始图像开始。

有人能告诉我我的K.gradients 实现有什么问题吗?

【问题讨论】:

    标签: python tensorflow image-processing keras gradient


    【解决方案1】:

    K.gradients 以 symbolic 方式计算梯度,您需要使用实际输入来评估梯度以获得 numerical 值。您可以使用K.function 来构建可调用对象:

    import keras.backend as K
    
    gradients = K.gradients(model.layers[-2].output, model.layers[0].input)[0]
    grad_fn = K.function([model.input], [gradients])
    

    然后您现在可以调用grad_fn 并使用适当的输入(包括批次维度)返回梯度的数值:

    actual_gradients = grad_fn([image])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多