9.4.2 在foolbox中使用jsma算法
    下面我们以imagenet 2012为例介绍如何在foolbox中使用jsma算法,代码路径为:
    https://github.com/duoergun0729/adversarial_examples/blob/master/code/9-foolbox-imagenet-jsma.ipynb
    首先加载需要使用的python库,使用的深度学习框架为keras+tensorflow。foolbox中对各种深度学习框架的封装在foolbox.models中,对攻击算法的封装在foolbox.attacks中。攻击的模型是基于imagenet 2012训练的resnet50,在keras.applications.resnet50中定义。
    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)))
    实例化jsma算法saliencymapattack,进行定向攻击,如果攻击失败会返回空,反之会返回生成的对抗样本,设置最大迭代次数为2000,扰动参数theta为0.3,每个像素最大扰动次数为7。
    from foolbox.criteria import targetclassprobability
    #定向攻击标签值为22
    target = targetclassprobability(22,p=0.5)
    #定向攻击
    attack = foolbox.attacks.saliencymapattack(fmodel,criterion=target)
    # 在keras中,resnet50 使用 bgr 而不是默认的 rgb
    adversarial = attack(image[:, :, ::-1],label,
    max_iter=2000,
    fast=true,
    theta=0.3,
    max_perturbations_per_pixel=7)
    if adversarial is none:
    print("fail to adversarial")
    else:
    pred = fmodel.predictions(adversarial)
    print("label={}".format(np.argmax(pred)))
    经过最多2000轮迭代,jsma定向攻击成功,原模型识别为标签22。如图9-10所示,量化的扰动量l0为1%,l2为4%,其中修改的像素个数为1286。
    image size 150528 shape (1, 224, 224, 3)
    noise l_0 norm: 1286 1%
    noise l_2 norm: 6.738266468048096 4%
    noise l_inf norm: 0.51171875 1%
    图9-10 在foolbox中使用jsma算法进行定向攻击效果图

章节目录

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