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