9.4.2 在FoolBox中使用JSMA算法
9.4.2 在foolbox中使用jsma算法
下面我们以imagenet 2012为例介绍如何在foolbox中使用jsma算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-jsma.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。foolbox中对各种深度学习框架的封装在foolbox.models中,对攻击算法的封装在foolbox.attacks中。攻击的模型是基于imagenet 2012训练的resnet50,在keras.applications.resnet50中定义。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50
实例化基于imagenet训练的resnet50模型,其中图像数据每个像素的取值范围为0到255,迭代攻击过程中超过这个范围的值需要进行截断处理。
kmodel = resnet50(weights='imagenet')
preprocessing = (np.array([104, 116, 123]), 1)
fmodel = foolbox.models.kerasmodel(kmodel, bounds=(0, 255),
preprocessing=preprocessing)
加载foolbox自带的测试图片和对应的标签,并对其进行预测,预测的标签为282。
# 加载原始图片和对应的标签
image, label = foolbox.utils.imagenet_example()
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
pred = fmodel.predictions(image[:, :, ::-1])
print("label={}".format(np.argmax(pred)))
实例化jsma算法saliencymapattack,进行定向攻击,如果攻击失败会返回空,反之会返回生成的对抗样本,设置最大迭代次数为2000,扰动参数theta为0.3,每个像素最大扰动次数为7。
from foolbox.criteria import targetclassprobability
#定向攻击标签值为22
target = targetclassprobability(22,p=0.5)
#定向攻击
attack = foolbox.attacks.saliencymapattack(fmodel,criterion=target)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label,
max_iter=2000,
fast=true,
theta=0.3,
max_perturbations_per_pixel=7)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
经过最多2000轮迭代,jsma定向攻击成功,原模型识别为标签22。如图9-10所示,量化的扰动量l0为1%,l2为4%,其中修改的像素个数为1286。
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 1286 1%
noise l_2 norm: 6.738266468048096 4%
noise l_inf norm: 0.51171875 1%
图9-10 在foolbox中使用jsma算法进行定向攻击效果图
下面我们以imagenet 2012为例介绍如何在foolbox中使用jsma算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-jsma.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。foolbox中对各种深度学习框架的封装在foolbox.models中,对攻击算法的封装在foolbox.attacks中。攻击的模型是基于imagenet 2012训练的resnet50,在keras.applications.resnet50中定义。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50
实例化基于imagenet训练的resnet50模型,其中图像数据每个像素的取值范围为0到255,迭代攻击过程中超过这个范围的值需要进行截断处理。
kmodel = resnet50(weights='imagenet')
preprocessing = (np.array([104, 116, 123]), 1)
fmodel = foolbox.models.kerasmodel(kmodel, bounds=(0, 255),
preprocessing=preprocessing)
加载foolbox自带的测试图片和对应的标签,并对其进行预测,预测的标签为282。
# 加载原始图片和对应的标签
image, label = foolbox.utils.imagenet_example()
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
pred = fmodel.predictions(image[:, :, ::-1])
print("label={}".format(np.argmax(pred)))
实例化jsma算法saliencymapattack,进行定向攻击,如果攻击失败会返回空,反之会返回生成的对抗样本,设置最大迭代次数为2000,扰动参数theta为0.3,每个像素最大扰动次数为7。
from foolbox.criteria import targetclassprobability
#定向攻击标签值为22
target = targetclassprobability(22,p=0.5)
#定向攻击
attack = foolbox.attacks.saliencymapattack(fmodel,criterion=target)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label,
max_iter=2000,
fast=true,
theta=0.3,
max_perturbations_per_pixel=7)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
经过最多2000轮迭代,jsma定向攻击成功,原模型识别为标签22。如图9-10所示,量化的扰动量l0为1%,l2为4%,其中修改的像素个数为1286。
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 1286 1%
noise l_2 norm: 6.738266468048096 4%
noise l_inf norm: 0.51171875 1%
图9-10 在foolbox中使用jsma算法进行定向攻击效果图