9.2.3 在advbox中使用deepfool算法
    下面我们以imagenet 2012为例介绍如何在advbox中使用deepfool算法,代码路径为:
    https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-advbox-imagenet-deepfool.ipynb
    首先加载需要使用的python库,使用的深度学习框架为tensorflow。通过sys.path.append把advbox的源码添加到python的系统路径中。
    import sys
    #添加系统路径
    sys.path.append("../advbox/")
    import numpy as np
    from pil import image
    #执行命令pip install pillow安装对应库
    from advbox.adversary import adversary
    from advbox.attacks.deepfool import deepfoolattack
    from advbox.models.tensorflow import tensorflowmodel
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    from tools import show_d
    从tensorflow的官网下载基于imagenet 2012预训练的inception模型,解压后获得对应的pb文件classify_image_graph_def.pb。
    http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
    定义全局变量,包括被攻击的图片和pb文件的路径。
    #定义被攻击的图片
    imagename="../advbox/tutorials/cropped_panda.jpg"
    dirname="../advbox/classify_image_graph_def.pb"
    加载图片文件,并缩放到长和宽均为224,并把形状转换成[1,224,224,3],与模型的输入层大小一致。
    image=np.array(image.open(imagename).convert('rgb').resize((224,224))).
    astype(np.float32)
    orig=image.copy().astype(np.uint8)
    #[224,224,3]->[1,224,224,3]
    image=np.expand_dims(image, axis=0)
    创建会话并加载pb文件,初始化会话的全局变量。
    session=tf.session()
    def create_graph(dirname):
    with tf.gfile.fastgfile(dirname, 'rb') as f:
    graph_def = session.graph_def
    graph_def.parsefromstring(f.read())
    _ = tf.import_graph_def(graph_def, name='')
    create_graph(dirname)
    # 初始化参数
    session.run(tf.global_variables_initializer())
    获取输出层和输入层的tensor,其中需要指出的是计算图中包含针对图像的预处理环节,即解码jpg文件,这部分没有梯度,需要直接处理解码后的数据,因此需要直接把'expanddims:0'当作输入tensor。
    #获取logits
    logits=session.graph.get_tensor_by_name('softmax/logits:0')
    x = session.graph.get_tensor_by_name('expanddims:0')
    实例化advbox对象,在本例中选择tensorflowmodel即可,其中channel_axis指的是通道字段在图像数据中的位置,tensorflow中imagenet 2012数据的形状为[none,224,224,3]。实例化deepfool对象,并设置攻击参数,其中iterations代表最大迭代次数,overshoot代表最后一次迭代的增益系数。
    # advbox示例
    # 因为原始数据没有归一化,所以bounds=(0, 255)
    m = tensorflowmodel(session,x,none,logits,none,
    bounds=(0, 255),channel_axis=3,preprocess=none)
    #实例化deepfool,进行定向攻击
    attack = deepfoolattack(m)
    attack_config = {"iterations": 100, "overshoot": 0.05}
    进行定向攻击,攻击目标的id为651。
    adversary = adversary(image,none)
    #麦克风
    tlabel = 651
    adversary.set_target(is_targeted_attack=true, target_label=tlabel)
    # deepfool 定向攻击
    adversary = attack(adversary, **attack_config)
    经过迭代计算,攻击成功。如图9-3所示,量化的扰动量l0为60%,l2为1%,其中修改的像素个数为90081,但是l2大小仅为1.62。
    deepfool.py[line:121] info iteration=26, f[pre_label]=-0.232765421271,
    f[target_label]=10.9849853516, f[adv_label]=10.9849853516, pre_label=169,
    adv_label=651
    attack success, adversarial_label=651
    deepfool attack done
    image size 150528 shape (1, 224, 224, 3)
    noise l_0 norm: 90081 60%
    noise l_2 norm: 1.619139447 1%
    noise l_inf norm: 0.046875 1%
    图9-3 advbox下deepfool定向攻击效果图

章节目录

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