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

章节目录

智能系统与技术丛书·AI安全之对抗样本入门所有内容均来自互联网,一曲书屋只为原作者兜哥的小说进行宣传。欢迎各位书友支持兜哥并收藏智能系统与技术丛书·AI安全之对抗样本入门最新章节