6.7 针对mnist生成通用对抗样本
    由于论文中使用的是imagenet2012数据集,压缩包大小都超过了100g,即使使用gpu资源也需要较长时间,下面我们以mnist为例介绍如何生成通用对抗扰动,代码路径为:
    https://github.com/duoergun0729/adversarial_examples/blob/master/code/
    6-universal.ipynb
    首先加载需要使用的库文件,其中针对mnist数据集的封装都在tutorials.mnist中。
    import tensorflow as tf
    import numpy as np
    from tensorflow.examples.tutorials.mnist import input_data
    from tensorflow.python.framework import graph_util
    from tensorflow.python.platform import gfile
    import os
    #mnist数据
    mnist = input_data.read_data_sets("mnist_data/", one_hot=true)
    加载mnist的预训练模型,本章使用的预训练模型在第2章介绍过,代码路径为:
    https://github.com/duoergun0729/adversarial_examples/blob/master/code/
    2-tensorflow.ipynb
    加载pb文件,恢复预训练模型,其中最关键的三个tensor分别为:
    ? input:0,表示模型的输入,本例中mnist数据集输入的大小为[none,784],并且已经做了归一化,大小为[0,1]。
    ? keep_prob:0,表示输入层和隐藏层之间保留的数据的比例,主要用于训练过程抵御过拟合,在训练阶段设置为0.75,预测阶段设置为1.0即可。
    ? output:0,表示模型的输出,大小为[none,10],表示识别为标签0至9之间的概率分布。
    #模型文件
    pb_file_path="tensorflow_mnist_graph.pb"
    #预测用的会话
    persisted_sess = tf.session()
    # 加载inception模型
    with gfile.fastgfile(pb_file_path, 'rb') as f:
    graph_def = tf.graphdef()
    graph_def.parsefromstring(f.read())
    persisted_sess.graph.as_default()
    tf.import_graph_def(graph_def, name='')
    persisted_sess.graph.get_operations()
    #记载输入和输出tensor
    persisted_input = persisted_sess.graph.get_tensor_by_name("input:0")
    persisted_keep_prob = persisted_sess.graph.get_tensor_by_name("keep_prob:0")
    persisted_output = persisted_sess.graph.get_tensor_by_name("output:0")
    定义前向计算过程,即预测过程。
    def f(image_inp,keep_prob=1.0):
    return persisted_sess.run(persisted_output, feed_dict={persisted_input:
    image_inp,
    persisted_keep_prob:keep_prob})
    在mnist的测试集上测试预训练模型的准确率以及错误率。
    #批量验证测试集的准确率
    from sklearn.metrics import accuracy_score
    test_x=mnist.test.images
    test_y=mnist.test.labels
    y_pred=np.argmax(f(test_x),axis=1)
    y_true=np.argmax(test_y,axis=1)
    print(accuracy_score(y_true, y_pred, normalize=true))
    num_images=test_x.shape[0]
    fooling_rate = float(np.sum(y_pred != y_true) / float(num_images))
    print('fooling rate = ', fooling_rate)
    运行结果如下,可见预训练模型的准确率为98.19%,错误率为1.81%。
    0.9819
    fooling rate = 0.0181
    定义投影函数,v表示迭代计算中的通用对抗扰动,p为范数,目前支持l2和无穷范数,xi即∈,控制扰动的大小。关于范数的定义可以参考1.1.5节的内容。
    def proj_lp(v, xi, p):
    if p == 2:
    v = v * min(1, xi/np.linalg.norm(v.flatten(1)))
    elif p == np.inf:
    v = np.sign(v) * np.minimum(abs(v), xi)
    else:
    raise valueerror('values of p different from 2 and inf are
    currently not supported...')
    return v
    迭代计算v,当欺骗率达到阈值或者达到最大迭代次数时退出。当发现当前样本叠加扰动v时没有欺骗模型,使用deepfool算法计算扰动dr,然后使用v+dr更新v,并且通过投影函数proj_lp让v的值同时也满足对范数的要求。deepfool算法的实现可以参考5.5节。
    v = 0
    fooling_rate = 0.0
    num_images = np.shape(dataset)[0]
    print("x size:{}".format(num_images))
    itr = 0
    while fooling_rate < 1-delta and itr < max_iter_uni:
    #随机排列数据集
    np.random.shuffle(dataset)
    print ('starting pass number ', itr)
    for k in range(0, num_images):
    cur_img = dataset[k:(k+1), :]
    if np.argmax(f(cur_img)) == np.argmax(f(cur_img+v)):
    #使用deepfool计算
    dr,iter,_,_ = deepfool( cur_img + v, f, grads,
    num_classes=num_classes,
    overshoot=overshoot,
    max_iter=max_iter_df)
    v = v + dr
    v = proj_lp(v, xi, p)
    itr = itr + 1
    使用测试集验证通用对抗样本的攻击效果,欺骗率达到90.26%。
    y_pred=np.argmax(f(test_x+v),axis=1)
    y_true=np.argmax(test_y,axis=1)
    print(accuracy_score(y_true, y_pred, normalize=true))
    num_images=test_x.shape[0]
    fooling_rate = float(np.sum(y_pred != y_true) / float(num_images))
    print('fooling rate = ', fooling_rate)

章节目录

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