9.4.2 在FoolBox中使用JSMA算法
9.4.2在FoolBox中使用JSMA算法
下面我们以ImageNet2012为例介绍如何在FoolBox中使用JSMA算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-jsma.ipynb
首先加载需要使用的Python库,使用的深度学习框架为Keras+TensorFlow。FoolBox中对各种深度学习框架的封装在foolbox.models中,对攻击算法的封装在foolbox.attacks中。攻击的模型是基于ImageNet2012训练的ResNet50,在keras.applications.resnet50中定义。
importfoolbox
importkeras
importnumpyasnp
fromkeras.applications.resnet50importResNet50
实例化基于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。
fromfoolbox.criteriaimportTargetClassProbability
#定向攻击标签值为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)
ifadversarialisNone:
print("Failtoadversarial")
else:
pred=fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
经过最多2000轮迭代,JSMA定向攻击成功,原模型识别为标签22。如图9-10所示,量化的扰动量l0为1%,l2为4%,其中修改的像素个数为1286。
ImageSize150528Shape(1,224,224,3)
NoiseL_0norm:12861%
NoiseL_2norm:6.7382664680480964%
NoiseL_infnorm:0.511718751%
图9-10在FoolBox中使用JSMA算法进行定向攻击效果图