AI 安全之对抗样本入门 (36):打造对抗样本工具箱 3.5

阅读数:7 2019 年 11 月 30 日 15:14

AI安全之对抗样本入门(36):打造对抗样本工具箱 3.5

(MXNet)

内容简介
第 1 章介绍了深度学习的基础知识,重点介绍了与对抗样本相关的梯度、优化器、反向传递等知识点。
第 2 章介绍了如何搭建学习对抗样本的软硬件环境,虽然 GPU 不是必需的,但是使用 GPU 可以更加快速地验证你的想法。
第 3 章概括介绍了常见的深度学习框架,从 TensorFlow、Keras、PyTorch 到 MXNet。
第 4 章介绍了图像处理领域的基础知识,这部分知识对于理解对抗样本领域的一些常见图像处理技巧非常有帮助。
第 5 章介绍了常见的白盒攻击算法,从基础的 FGSM、DeepFool 到经典的 JSMA 和 CW。
第 6 章介绍了常见的黑盒攻击算法。
第 7 章介绍了对抗样本在目标识别领域的应用。
第 8 章介绍了对抗样本的常见抵御算法,与对抗样本一样,抵御对抗样本的技术也非常有趣。
第 9 章介绍了常见的对抗样本工具以及如何搭建 NIPS 2017 对抗防御环境和轻量级攻防对抗环境 robust-ml,通过这章读者可以了解如何站在巨人的肩膀上,快速生成自己的对抗样本,进行攻防对抗。

MXNet 是亚马逊开发的深度学习库,它拥有类似于 Theano 和 TensorFlow 的数据流图,并且可以在常见的硬件平台上运行。MXNet 还提供了 R、C++、Scala 等语言的接口。我们以解决经典的手写数字识别的问题为例,介绍 MXNet 的基本使用方法,代码路径为:

复制代码
https://github.com/duoergun0729/adversarial_examples/blob/master/code/2-mxnet.ipynb
  1. 加载相关库

加载处理经典的手写数字识别问题相关的 Python 库:

复制代码
import mxnet as mx
import logging
  1. 加载数据集

MXNet 中也针对常见的数据集进行了封装,免去了用户手工下载的过程并简化了预处理的过程:

复制代码
mnist = mx.test_utils.get_mnist()
batch_size = 128
train_iter = mx.io.NDArrayIter(mnist['train_data'], mnist['train_label'],
batch_size, shuffle=True)
val_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'],
batch_size)
  1. 定义网络结构

使用与 Keras 几乎完全相同的网络结构,只不过省略了 Dropout 层。

复制代码
data = mx.sym.var('data')
data = mx.sym.flatten(data=data)
#全连接
fc1 = mx.sym.FullyConnected(data=data, num_hidden = 512)
act1 = mx.sym.Activation(data=fc1, act_type="relu")
fc2 = mx.sym.FullyConnected(data=act1, num_hidden = 512)
act2 = mx.sym.Activation(data=fc2, act_type="relu")
fc3 = mx.sym.FullyConnected(data=act2, num_hidden=10)
# softmax 输出
mlp = mx.sym.SoftmaxOutput(data=fc3, name='softmax')
mlp_model = mx.mod.Module(symbol=mlp, context=ctx)

可视化网络结构,如图 3-8 所示,值得一提的是 MXNet 自带的可视化工具非常便于使用。

复制代码
import matplotlib.pyplot as plt
mx.viz.plot_network(mlp).view()

AI安全之对抗样本入门(36):打造对抗样本工具箱 3.5

图 3-8 MXNet 处理 MNIST 的网络结构图
  1. 定义损失函数和优化器

损失函数使用交叉熵 CrossEntropyLoss,优化器使用 sgd。

  1. 训练与验证

MXNet 的训练和验证过程是分开的,训练阶段加载优化器的配置,可以指定每训练 100 个批次,打印中间结果。

复制代码
mlp_model.fit(train_iter,
eval_data=val_iter,
optimizer='sgd',
optimizer_params={'learning_rate':0.1},
eval_metric='acc',
batch_end_callback = mx.callback.Speedometer(batch_size, 100),
num_epoch=20)

经过 20 轮的训练后,在测试集上验证准确度。

复制代码
test_iter = mx.io.NDArrayIter(mnist['test_data'], mnist['test_label'], batch_size)
acc = mx.metric.Accuracy()
mlp_model.score(test_iter, acc)
print(acc)

最终在测试集上准确度达到了 97.62%。

复制代码
INFO:root:Epoch[19] Train-accuracy=0.996438
INFO:root:Epoch[19] Time cost=4.017 INFO:root:Epoch[19] Validation-accuracy=0.976167
EvalMetric: {'accuracy': 0.9761669303797469}

MXNet 保存的模型文件后缀为 parms。

复制代码
mlp_model.save_checkpoint('models/mxnet.parms',20)

AI安全之对抗样本入门(36):打造对抗样本工具箱 3.5

购书地址 https://item.jd.com/12532163.html?dist=jd

评论

发布