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演算法進行定向攻擊效果圖