9.3.3 ART下使用CW算法
9.3.3ART下使用CW算法
下面我们以ImageNet2012为例介绍如何在ART中使用CW算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
9-art-imagenet-cw.ipynb
首先加载需要使用的Python库,使用的深度学习框架为Keras+TensorFlow。攻击的模型是基于ImageNet2012训练的ResNet50,在keras.applications.resnet50中定义。
%matplotlibinline
importkeras.backendask
fromkeras.applicationsimportresnet50
fromkeras.preprocessingimportimage
fromkeras.applications.imagenet_utilsimportdecode_predictions
fromkeras.utilsimportnp_utils
importnumpyasnp
importtensorflowastf
importmatplotlib.pyplotasplt
#加载模型
fromkeras.applications.resnet50importResNet50,preprocess_input
fromart.classifiersimportKerasClassifier
实例化基于ImageNet训练的ResNet50模型,其中图像数据每个像素的取值范围为0到255,迭代攻击过程中超过这个范围的值需要进行截断处理。
model=ResNet50(weights='imagenet')
classifier=KerasClassifier(clip_values=(0,255),model=model)
读取测试图片,因为在ResNet50中定义的输入层形状为[None,224,224,3],所以需要把图片转换成(224,224)大小,信道数保持为3不变。
image_file="../picture/cropped_panda.jpg"
image_=image.load_img(image_file,target_size=(224,224))
img=image.img_to_array(image_)
对测试图片(见图9-8)进行预测,Keras中提供了decode_predictions把预测的标签转换成物体名称,预测的结果为熊猫(giant_panda)。
plt.imshow(img/255)
img=img[None,...]
#Predictforcleanimage
pred=classifier.predict(img)
print(decode_predictions(pred)[0][0])
('n02510455','giant_panda',0.456376)
图9-8在ART中使用CW算法攻击的原始图片
首先我们尝试使用CW进行l2型无定向攻击,设置二分查找的轮数为10,每轮Adam优化的最大迭代次数为100,学习速率为1e-3,c的初始值为3.125。
fromart.attacksimportCarliniL2Method
#创建CW无定向攻击
adv=CarliniL2Method(classifier,targeted=False,max_iter=100,
binary_search_steps=10,learning_rate=1e-3,
initial_const=3.125)
#生成攻击图片
img_adv=adv.generate(img)
#用模型评估
pred_adv=model.predict(img_adv)
print(decode_predictions(pred_adv)[0][0])
('n02113624','toy_poodle',0.6728172)
经过10轮二分查找,CW无定向攻击成功,原模型识别为贵宾犬(toy_poodle)。如图9-9所示,量化的扰动量l0为1%,l2为1%。
fromtoolsimportshow_d
show_d(img/256.0,img_adv/256.0)
NoiseL_0norm:1%
NoiseL_2norm:1%
NoiseL_infnorm:1%
图9-9在ART中使用CW算法进行不定向攻击效果图