6.2 单像素攻击MNIST识别模型
6.2 单像素攻击mnist识别模型
advbox中提供了基于paddlepaddle平台的示例,介绍如何使用single pixel attack攻击基于cnn的mnist识别模型,代码路径为:
https://github.com/baidu/advbox/blob/master/tutorials/mnist_tutorial_
singlepixelattack.py
首先加载需要使用的库文件,其中paddleblackboxmodel封装了paddlepaddle下的模型。
import sys
import os
sys.path.append("..")
import numpy as np
import paddle.fluid as fluid
import paddle.v2 as paddle
from advbox.adversary import adversary
from advbox.attacks.localsearch import singlepixelattack
from advbox.models.paddleblackbox import paddleblackboxmodel
from tutorials.mnist_model import mnist_cnn_model
通过设置环境变量with_gpu来动态设置是否使用gpu资源,这特别适合在mac上开发但是在gpu服务器上运行的情况。比如在mac上不设置该环境变量,在gpu服务器上设置export with_gpu=1。
with_gpu = os.getenv('with_gpu', '0') != '0'
定义test_reader,从mnist的测试集中随机产生数据,每次产生一个。
batch_size = 1
test_reader = paddle.batch(
paddle.reader.shuffle( paddle.dataset.mnist.test(), buf_size=128 * 10),
batch_size=batch_size)
加载预训练的cnn模型,模型的目录在mnist下。
fluid.io.load_params(exe, "./mnist/", main_program=fluid.default_main_program())
创建paddlepaddle下的模型对象以及single pixel attack算法对象。mnist数据集中的图像大小为[28,28,1],因此max_pixels最大不能超过28x28。
m = paddleblackboxmodel(fluid.default_main_program().clone(for_test=true),
img_name,label_name,logits.name, (0, 255),channel_axis=0)
#形状为[1,28,28] channel_axis=0
#形状为[28,28,1] channel_axis=2
attack = singlepixelattack(m)
attack_config = {"max_pixels": 28*28}
遍历测试数据集,加载图像数据到img中,标签数据为data[0][1]。
# 使用测试数据生成对抗样本
total_count = 0
fooling_count = 0
for data in test_reader():
total_count += 1
img=data[0][0]
img=np.reshape(img,[1,28,28])
adversary = adversary(img, data[0][1])
# singlepixelattack 无定向攻击
adversary = attack(adversary, **attack_config)
统计攻击结果,超出最大测试次数时退出。
if adversary.is_successful():
fooling_count += 1
print('attack success, original_label=%d, adversarial_label=%d,
count=%d'% (data[0][1], adversary.adversarial_label, total_count))
else:
print('attack failed, original_label=%d, count=%d' % (data[0][1],
total_count))
if total_count >= total_num:
print("[test_dataset]: fooling_count=%d, total_count=%d, fooling_rate=%f"
% (fooling_count, total_count,float(fooling_count) / total_count))
break
下面介绍如何生成攻击用的模型,advbox的测试模型是一个识别mnist的cnn模型。
python mnist_model.py
运行攻击代码,以基于singlepixelattack算法的演示代码为例。
python mnist_tutorial_singlepixelattack.py
运行结果如下,随机选择了mnist测试集中的10张图片用于测试,singlepixelattack算法攻击成功率为100%。
[test_dataset]: fooling_count=10, total_count=10, fooling_rate=1.000000
singlepixelattack attack done
advbox中提供了基于paddlepaddle平台的示例,介绍如何使用single pixel attack攻击基于cnn的mnist识别模型,代码路径为:
https://github.com/baidu/advbox/blob/master/tutorials/mnist_tutorial_
singlepixelattack.py
首先加载需要使用的库文件,其中paddleblackboxmodel封装了paddlepaddle下的模型。
import sys
import os
sys.path.append("..")
import numpy as np
import paddle.fluid as fluid
import paddle.v2 as paddle
from advbox.adversary import adversary
from advbox.attacks.localsearch import singlepixelattack
from advbox.models.paddleblackbox import paddleblackboxmodel
from tutorials.mnist_model import mnist_cnn_model
通过设置环境变量with_gpu来动态设置是否使用gpu资源,这特别适合在mac上开发但是在gpu服务器上运行的情况。比如在mac上不设置该环境变量,在gpu服务器上设置export with_gpu=1。
with_gpu = os.getenv('with_gpu', '0') != '0'
定义test_reader,从mnist的测试集中随机产生数据,每次产生一个。
batch_size = 1
test_reader = paddle.batch(
paddle.reader.shuffle( paddle.dataset.mnist.test(), buf_size=128 * 10),
batch_size=batch_size)
加载预训练的cnn模型,模型的目录在mnist下。
fluid.io.load_params(exe, "./mnist/", main_program=fluid.default_main_program())
创建paddlepaddle下的模型对象以及single pixel attack算法对象。mnist数据集中的图像大小为[28,28,1],因此max_pixels最大不能超过28x28。
m = paddleblackboxmodel(fluid.default_main_program().clone(for_test=true),
img_name,label_name,logits.name, (0, 255),channel_axis=0)
#形状为[1,28,28] channel_axis=0
#形状为[28,28,1] channel_axis=2
attack = singlepixelattack(m)
attack_config = {"max_pixels": 28*28}
遍历测试数据集,加载图像数据到img中,标签数据为data[0][1]。
# 使用测试数据生成对抗样本
total_count = 0
fooling_count = 0
for data in test_reader():
total_count += 1
img=data[0][0]
img=np.reshape(img,[1,28,28])
adversary = adversary(img, data[0][1])
# singlepixelattack 无定向攻击
adversary = attack(adversary, **attack_config)
统计攻击结果,超出最大测试次数时退出。
if adversary.is_successful():
fooling_count += 1
print('attack success, original_label=%d, adversarial_label=%d,
count=%d'% (data[0][1], adversary.adversarial_label, total_count))
else:
print('attack failed, original_label=%d, count=%d' % (data[0][1],
total_count))
if total_count >= total_num:
print("[test_dataset]: fooling_count=%d, total_count=%d, fooling_rate=%f"
% (fooling_count, total_count,float(fooling_count) / total_count))
break
下面介绍如何生成攻击用的模型,advbox的测试模型是一个识别mnist的cnn模型。
python mnist_model.py
运行攻击代码,以基于singlepixelattack算法的演示代码为例。
python mnist_tutorial_singlepixelattack.py
运行结果如下,随机选择了mnist测试集中的10张图片用于测试,singlepixelattack算法攻击成功率为100%。
[test_dataset]: fooling_count=10, total_count=10, fooling_rate=1.000000
singlepixelattack attack done