《AI安全之对抗样本入门》—3.3 Keras

举报
华章计算机 发表于 2019/06/17 18:18:26 2019/06/17
【摘要】 本节书摘来自华章计算机《AI安全之对抗样本入门》一书中的第3章,第3.3节,作者是兜哥。

3.3 Keras

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

2. 加载数据集

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)

3. 定义网络结构

定义网络结构是指根据建模定义前向传播过程。本例中输入层大小为(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所示。

 image.png

图3-6 Keras处理MNIST的网络结构图

4. 定义损失函数和优化器

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

model.compile(loss='categorical_crossentropy',

              optimizer=RMSprop(),

              metrics=['accuracy'])

5. 训练与验证

为了尽可能提高准确度,让网络中的众多参数得到充分训练,通常深度学习都会在同一数据集上结合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性能、支持几乎无限量的单文件存储等特点,详见其官方介绍,网址为https://support.hdfgroup.org/HDF5/。

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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。