获取激活前图层相对于输入图片的梯度
Get gradient of layer before activation with respect to input picture
目前,我正在进行通用扰动类型的研究,我将在激活函数之前使用层的梯度来回溯上次迭代中采用的梯度步骤。
但是,当我尝试使用 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
实现有什么问题吗?
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
,这将 return 梯度的数值:
actual_gradients = grad_fn([image])
目前,我正在进行通用扰动类型的研究,我将在激活函数之前使用层的梯度来回溯上次迭代中采用的梯度步骤。 但是,当我尝试使用 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
实现有什么问题吗?
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
,这将 return 梯度的数值:
actual_gradients = grad_fn([image])