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

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

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

(Keras)

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

Keras 本质上还算不上一个深度学习框架,它的底层还是要依赖 TensorFlow 这些深度学习框架,但是相对 TensorFlow 复杂的语法,Keras 通过封装,提供了一套非常简洁的接口,让熟悉 Python 开发的人可以快速上手。我们以解决经典的手写数字识别的问题为例,介绍 Keras 的基本使用方法,代码路径为:

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

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

复制代码
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
  1. 加载数据集

Keras 中针对常见的数据集进行了封装,免去了用户手工下载的过程并简化了预处理的过程。在 Keras 中直接调用 to_categorical 函数即可完成独热编码的转换:

复制代码
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
  1. 定义网络结构

定义网络结构是指根据建模定义前向传播过程。本例中输入层大小为(784),第一层隐藏层节点数为 512,激活函数为 relu,第二层也是 512,激活函数也为 relu。中间为了避免过拟合,使用 Dropout 层,随机丢失 20% 数据,输出层大小为 10,激活函数为 softmax:

复制代码
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(num_classes, activation='softmax'))
model.summary()

最后可视化网络结构,细节如图 3-6 所示。

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

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

完成了前向传播的定义,就需要定义损失函数和优化器,便于训练阶段进行反向传递。本例为多分类问题,故使用 categorical_crossentropy 定义损失函数,使用 RMSprop 优化器:

复制代码
model.compile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])
  1. 训练与验证

为了尽可能提高准确度,让网络中的众多参数得到充分训练,通常深度学习都会在同一数据集上结合 Dropout 进行多轮训练,由于 Dropout 会随机丢失一些特征,相当于增加了新的训练数据。本例中批处理大小为 128,训练的轮数为 20 轮,如果我们观察训练第 20 轮时损失函数还有下降的趋势,可以适当增加训练轮数。

复制代码
batch_size = 128
num_classes = 10
epochs = 20

在训练集上进行训练,并使用测试集进行效果验证,Keras 将这两个过程使用一个 API 完成,这也正是 Keras 强大的地方,最终我们考核的是 accuracy 即准确度(预测正确的占总量的比例)。

复制代码
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

经过 20 轮训练,在测试集上准确度达到了 98.44%:

复制代码
Epoch 20/20 60000/60000 [==============================]
- 10s 165us/step
- loss: 0.0186
- acc: 0.9950
- val_loss: 0.1122
- val_acc: 0.9844
('Test loss:', 0.11221564155901237)
('Test accuracy:', 0.9844)

回顾整个过程,Keras 完全实现了自动化反向传递,屏蔽了大量底层细节,读者完全感觉不到梯度和反向传递的存在。

保存 Keras 的模型十分方便,直接调用 save 方法即可,保存的格式为 HDF5:

复制代码
model.save('models/keras-model.h5')

HDF(Hierarchical Data Format)是一种为存储和处理大容量科学数据设计的文件格式及相应库文件。HDF 最早由美国国家超级计算应用中心 NCSA 开发,目前在非盈利组织 HDF 小组维护下继续发展。当前流行的版本是 HDF5。HDF5 拥有一系列的优异特性,使其特别适合进行大量科学数据的存储和操作,它支持非常多的数据类型,具有灵活、通用、跨平台、可扩展、高效的 I/O 性能、支持几乎无限量的单文件存储等特点1,详见其官方介绍,网址为 https://support.hdfgroup.org/HDF5/

1 https://www.jianshu.com/p/de9f33cdfba0

Keras 通过 HDF5 文件把网络结构和对应参数进行了持久化。

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

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

评论

发布