利用Keras实现FGSM算法

最近项目中需要使用FGSM攻击方法,使用主流的foolboxcleverhans中的攻击方法时,发现模型不匹配,所以不能继续使用,网上找到的代码也不能使用,需要自己实现一个。

根据论文 Explaining and Harnessing Adversarial Examples,FGSM的原理是损失函数对图像x求梯度,所以先求得损失函数,之后再对图像x求导,获得梯度,代码如下。
利用Keras实现FGSM算法_第1张图片
其中噪声的计算方法如下所示,ε 表示扰动的大小,L 表示损失函数。
在这里插入图片描述

通过查找资料和讨论,得出了如下的代码。

from keras import backend, losses

def fgsm(model, image, y_true, eps=0.1):
   
    y_pred = model.output 
    
    # y_true: 目标真实值的张量。
    # y_pred: 目标预测值的张量。
    loss = losses.categorical_crossentropy(y_true, y_pred)

    gradient = backend.gradients(loss, model.input)
    gradient = gradient[0] 

    adv = image + backend.sign(gradient) * eps #fgsm算法
    
    sess = backend.get_session() 
    adv = sess.run(adv, feed_dict={ model.input : image}) #注意这里传递参数的情况
    adv = np.clip(adv, 0, 255) #有的像素点会超过255,需要处理

    return adv

参考:

  1. stackoverflow问答 https://stackoverflow.com/questions/39561560/getting-gradient-of-model-output-w-r-t-weights-using-keras
  2. keras的官方issue https://github.com/keras-team/keras/issues/2226
  3. stackoverflow问答 https://stackoverflow.com/questions/54480208/get-gradient-values-in-a-cnn-with-keras-tf

你可能感兴趣的:(Python,对抗与防御)