6.7 针对MNIST生成通用对抗样本
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)
由于论文中使用的是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)