9.3.3 ART下使用CW算法
9.3.3 art下使用cw算法
下面我们以imagenet2012为例介绍如何在art中使用cw算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
9-art-imagenet-cw.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。攻击的模型是基于imagenet 2012训练的resnet50,在keras.applications.resnet50中定义。
%matplotlib inline
import keras.backend as k
from keras.applications import resnet50
from keras.preprocessing import image
from keras.applications.imagenet_utils import decode_predictions
from keras.utils import np_utils
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# 加载模型
from keras.applications.resnet50 import resnet50, preprocess_input
from art.classifiers import kerasclassifier
实例化基于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, ...]
# predict for clean image
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。
from art.attacks import carlinil2method
# 创建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%。
from tools import show_d
show_d(img/256.0,img_adv/256.0)
noise l_0 norm: 1%
noise l_2 norm: 1%
noise l_inf norm: 1%
图9-9 在art中使用cw算法进行不定向攻击效果图
下面我们以imagenet2012为例介绍如何在art中使用cw算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
9-art-imagenet-cw.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。攻击的模型是基于imagenet 2012训练的resnet50,在keras.applications.resnet50中定义。
%matplotlib inline
import keras.backend as k
from keras.applications import resnet50
from keras.preprocessing import image
from keras.applications.imagenet_utils import decode_predictions
from keras.utils import np_utils
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# 加载模型
from keras.applications.resnet50 import resnet50, preprocess_input
from art.classifiers import kerasclassifier
实例化基于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, ...]
# predict for clean image
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。
from art.attacks import carlinil2method
# 创建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%。
from tools import show_d
show_d(img/256.0,img_adv/256.0)
noise l_0 norm: 1%
noise l_2 norm: 1%
noise l_inf norm: 1%
图9-9 在art中使用cw算法进行不定向攻击效果图