目前,我正在研究通用扰动类型的研究,在该研究中,我将使用激活函数之前的图层梯度来回溯上次迭代中采用的梯度步骤。 但是,当我尝试使用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))
这里,渐变应该是渐变函数,以获取精确的渐变。当我使用以下代码时,我得到了张量:
gradients = K.gradients(model.layers[-2].output, model.layers[0].input)[0]
其中输出是I,在进行激活进行分类之前影响最大,输入是扰动图像,从原始图像开始。
有人可以告诉我我的K.gradients
实现有什么问题吗?
答案 0 :(得分:2)
K.gradients以符号的方式计算梯度,您需要使用实际输入来评估梯度以获取数值值。您可以使用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])