6.4 本地搜索攻击ResNet模型
6.4 本地搜索攻击resnet模型
我们以foolbox为例,基于keras平台介绍如何使用本地搜索攻击resnet模型,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
6-localsearchattack.ipynb
首先加载需要使用的库文件,其中keras.applications.resnet50封装了keras下的resnet50模型。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50,decode_predictions
创建resnet50对象,由于imagenet下图像数据需要进行标准化,因此需要定义预处理参数,均值为[104,116,123]。
keras.backend.set_learning_phase(1)
kmodel = resnet50(weights='imagenet')
preprocessing = (np.array([104, 116, 123]), 1)
fmodel = foolbox.models.kerasmodel(kmodel, bounds=(0, 255),
preprocessing=preprocessing)
这里需要特别强调的是,需要设置为预测模式,因为某些层在预测和训练时表现不同,比如dropout层在预测模式时就不会随机丢失数据。set_learning_phase(0)代表训练模式,set_learning_phase(1)代表预测模式。
使用foolbox自带的测试图片,获取对应的图片数据和标签。
image, label = foolbox.utils.imagenet_example()
创建localsearchattack对象。因为keras的resnet50需要使用bgr格式,而模式图片是rgb格式,所以需要对图片进行格式转换。
attack = foolbox.attacks.localsearchattack(fmodel)
adversarial = attack(image[:, :, ::-1], label)
if adversarial is not none:
adversarial_label=np.argmax(fmodel.predictions(adversarial))
print("adversarial label={},original
label={}".format(adversarial_label,label))
else:
print("fail to localsearchattack!")
图6-3分别展示了原始图像、对抗样本及两者之间的差异,可见两者的差异很小。
plt.figure()
plt.subplot(1, 3, 1)
plt.title('original')
plt.imshow(image / 255) # division by 255 to convert [0, 255] to [0, 1]
plt.axis('off')
plt.subplot(1, 3, 2)
plt.title('adversarial')
plt.imshow(adversarial[:, :, ::-1] / 255) # ::-1 to convert bgr to rgb
plt.axis('off')
plt.subplot(1, 3, 3)
plt.title('difference')
difference = adversarial[:, :, ::-1] - image
plt.imshow(difference / abs(difference).max() * 0.2 + 0.5)
plt.axis('off')
plt.show()
图6-3 原始图像和对抗样本的对比示意图
另外一方面,打印原始图像和对抗样本的标签值,分别为281和282。
adversarial label=281,original label=282
如果希望显示具体哪些点发生了变化,可以打印非零的像素。
print(np.where(difference!=0.0))
我们以foolbox为例,基于keras平台介绍如何使用本地搜索攻击resnet模型,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/
6-localsearchattack.ipynb
首先加载需要使用的库文件,其中keras.applications.resnet50封装了keras下的resnet50模型。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50,decode_predictions
创建resnet50对象,由于imagenet下图像数据需要进行标准化,因此需要定义预处理参数,均值为[104,116,123]。
keras.backend.set_learning_phase(1)
kmodel = resnet50(weights='imagenet')
preprocessing = (np.array([104, 116, 123]), 1)
fmodel = foolbox.models.kerasmodel(kmodel, bounds=(0, 255),
preprocessing=preprocessing)
这里需要特别强调的是,需要设置为预测模式,因为某些层在预测和训练时表现不同,比如dropout层在预测模式时就不会随机丢失数据。set_learning_phase(0)代表训练模式,set_learning_phase(1)代表预测模式。
使用foolbox自带的测试图片,获取对应的图片数据和标签。
image, label = foolbox.utils.imagenet_example()
创建localsearchattack对象。因为keras的resnet50需要使用bgr格式,而模式图片是rgb格式,所以需要对图片进行格式转换。
attack = foolbox.attacks.localsearchattack(fmodel)
adversarial = attack(image[:, :, ::-1], label)
if adversarial is not none:
adversarial_label=np.argmax(fmodel.predictions(adversarial))
print("adversarial label={},original
label={}".format(adversarial_label,label))
else:
print("fail to localsearchattack!")
图6-3分别展示了原始图像、对抗样本及两者之间的差异,可见两者的差异很小。
plt.figure()
plt.subplot(1, 3, 1)
plt.title('original')
plt.imshow(image / 255) # division by 255 to convert [0, 255] to [0, 1]
plt.axis('off')
plt.subplot(1, 3, 2)
plt.title('adversarial')
plt.imshow(adversarial[:, :, ::-1] / 255) # ::-1 to convert bgr to rgb
plt.axis('off')
plt.subplot(1, 3, 3)
plt.title('difference')
difference = adversarial[:, :, ::-1] - image
plt.imshow(difference / abs(difference).max() * 0.2 + 0.5)
plt.axis('off')
plt.show()
图6-3 原始图像和对抗样本的对比示意图
另外一方面,打印原始图像和对抗样本的标签值,分别为281和282。
adversarial label=281,original label=282
如果希望显示具体哪些点发生了变化,可以打印非零的像素。
print(np.where(difference!=0.0))