9.4.3 在FoolBox中使用CW算法
9.4.3 在foolbox中使用cw算法
下面我们以imagenet 2012为例介绍如何在foolbox中使用cw算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-cw.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50
实例化基于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)))
实例化cw的l2算法carliniwagnerl2attack,尝试进行无定向攻击(见图9-11),如果攻击失败会返回空,反之会返回生成的对抗样本。对抗样本的预测结果为281。
#无定向攻击
attack = foolbox.attacks.carliniwagnerl2attack(fmodel)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
图9-11 在foolbox中使用cw算法进行无定向攻击效果图
然后尝试进行定向攻击,定向攻击需要指定攻击目标的标签及其对应的最小概率。
from foolbox.criteria import targetclassprobability
#定向攻击标签值为22
target = targetclassprobability(22,p=0.5)
#定向攻击
attack = foolbox.attacks.carliniwagnerl2attack(fmodel,criterion=target)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
cw定向攻击成功,原模型识别为标签22。如图9-12所示,量化的扰动量l0为99%,l2为1%,其中修改的像素个数为150 461,但是l2大小仅为0.026。与jsma相比,定向攻击目标相同,cw的优势是l2小,jsma的优势是l0小,事实上cw也支持l0算法,但是jsma仅支持l0算法。
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 150461 99%
noise l_2 norm: 0.02572029083967209 1%
noise l_inf norm: 0.0007488429546356201 1%
图9-12 在foolbox中使用cw算法进行定向攻击效果图
下面我们以imagenet 2012为例介绍如何在foolbox中使用cw算法,代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-cw.ipynb
首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。
import foolbox
import keras
import numpy as np
from keras.applications.resnet50 import resnet50
实例化基于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)))
实例化cw的l2算法carliniwagnerl2attack,尝试进行无定向攻击(见图9-11),如果攻击失败会返回空,反之会返回生成的对抗样本。对抗样本的预测结果为281。
#无定向攻击
attack = foolbox.attacks.carliniwagnerl2attack(fmodel)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
图9-11 在foolbox中使用cw算法进行无定向攻击效果图
然后尝试进行定向攻击,定向攻击需要指定攻击目标的标签及其对应的最小概率。
from foolbox.criteria import targetclassprobability
#定向攻击标签值为22
target = targetclassprobability(22,p=0.5)
#定向攻击
attack = foolbox.attacks.carliniwagnerl2attack(fmodel,criterion=target)
# 在keras中,resnet50 使用 bgr 而不是默认的 rgb
adversarial = attack(image[:, :, ::-1],label)
if adversarial is none:
print("fail to adversarial")
else:
pred = fmodel.predictions(adversarial)
print("label={}".format(np.argmax(pred)))
cw定向攻击成功,原模型识别为标签22。如图9-12所示,量化的扰动量l0为99%,l2为1%,其中修改的像素个数为150 461,但是l2大小仅为0.026。与jsma相比,定向攻击目标相同,cw的优势是l2小,jsma的优势是l0小,事实上cw也支持l0算法,但是jsma仅支持l0算法。
image size 150528 shape (1, 224, 224, 3)
noise l_0 norm: 150461 99%
noise l_2 norm: 0.02572029083967209 1%
noise l_inf norm: 0.0007488429546356201 1%
图9-12 在foolbox中使用cw算法进行定向攻击效果图