实验一:前向神经网络
- 实验环境
Windows10 + Keras
- 实验目标
- 掌握三种常用的深度学习网络结构
- 了解深度学习应用系统的框架
- 运用Keras快速搭建深度学习应用系统
- 熟悉常用参数调优的方法
- 实验方法
- 课堂引导(5-10分钟)
- 课堂实践
- 能力提升
- 调整超参数
- 调整模型结构
- 对比实验效果
- 实验规划
- Hello world
- 载入数据
加载Keras中的MNIST数据集
Train_images和train_labels组成了训练集。模型将从这些数据中进行学习。然后在测试集上对模型进行测试。
图像被编码为numpy数组,而标签是数字数组,取值范围为0-9.图像与标签一一对应。
- 数据重塑
对数据进行预处理,将其变换为网络要求的形状,并缩放在[0,1]区间,本例中将形状为(60000,28,28)类型为uint8,取值空间为[0,255]的数组变换为float32数组,形状为(60000,28*28),取值范围为0-1。
- 标签编码
将每个标签表示为全零向量,,只有标签索引对应的元素为1
- 模型建立
本例中的网络包含2个dense层,它们是密集连接的神经层,第二层是一个10路的softmax层,它将返回一个由10个概率值组成的数组。每个概率值表示当前数字图像属于10个数字类别中某一个的概率。同时设置训练容器。
- 模型训练
指定迭代次数为5
指定数据输入块大小为128
- 结果测试
训练数据上精度达到0.989
测试集精度为0.977
- 自主练习
- 改变网络的深度和宽度
综合情况如下所示
| 深度 | 宽度 | 训练集精度 | 测试集精度 |
基准 | 2 | 512 | 0.9891
| 0.974399983882904
|
深度不变,减小宽度 | 2 | 256 | 0.9856
| 0.9779000282287598
|
深度不变,增大宽度 | 2 | 1024 | 0.9910
| 0.980400025844574
|
减少深度 | 1 |
| 0.9222
| 0.9236000180244446
|
宽度不变,增大深度 | 3 | 512 | 0.9911
| 0.9790999889373779
|
深度增大,宽度减小 | 3 | 256 | 0.9889
| 0.9812999963760376
|
深度增大,宽度增大 | 3 | 1024 | 0.9912
| 0.9828000068664551
|
1.深度不变时,减小宽度,会使训练集精度下降,测试集上精度上升。
2.深度不变时,增大宽度,会使训练集精度和测试集精度均上升。
3.减小深度,会使测试集和训练集上精度下降。
4.宽度不变时,增大深度,训练集精度和测试集精度均上升。
总结:
增大深度和宽度,会使训练集精度上升。在一定范围内,也会使测试集精度上升,但超过范围,出现过拟合,深度增加引起的过拟合更为严重。
- 改变优化算法
优化算法 | 训练集精度 | 测试集精度 |
Sgd | 0.9041 | 0.9126999974250793 |
Adagrad | 0.9828 | 0.9764000177383423 |
Adadelta | 0.9851 | 0.9789000153541565 |
RMSprop | 0.9886 | 0.9800000190734863 |
Adam | 0.9893 | 0.9789999723434448 |
Adamax | 0.9834 | 0.9781000018119812 |
由此可见rmsprop算法较为合适
- 前向深度神经网络
- 载入数据
载入reuters数据集,并限定为前10000个最常出现的单词。
每个样本都是一个整数列表(表示单词索引)
样本对应的标签是一个0-45范围内的整数,即话题索引编号。
- 尝试将索引解码为单词
- 实现数据向量化
- 标签向量化
- 将标签向量化有两种方法:可以将标签列表转换为整数张量,或者实验one-hot编码。One-hot编码是分类数据广泛使用的一种格式,也叫分类编码。
- 构建网络
网络最后一层是大小为46的Dense层,对于每个输入样本,网络都会输出一个46维向量,并且该层使用了softmax激活,网络将输出在46个不同输出类别上的概率密度
- 编译模型
损失函数为分类交叉熵,用于衡量两个概率分布之间的距离,通过使网络输出的概率分布和标签的真实分布距离最小化,训练网络可使输出结果尽可能接近真实标签。
- 留出验证集
- 训练模型
- 结果测试
测试集损失函数、测试集的正确率
对单个测试数据预测主题
- 自主练习
降低网络宽度对结果的影响,例如:64->4
结果如下
由此可知降低网络宽度会使测试集精度下降。
改变损失函数
损失函数 | 训练集精度 | 验证集精度 | 测试集精度 |
mean_squared_error | 0.9102 | 0.7980 | 0.7738201022148132 |
mean_absolute_error | 0.9212 | 0.8120 | 0.7858415246009827 |
mean_absolute_percentage_error | 0.9395
| 0.8000
| 0.7747105956077576
|
mean_squared_logarithmic_error | 0.9402
| 0.7870
| 0.7626892328262329
|
squared_hinge | 0.9431
| 0.8080
| 0.7871772050857544
|
hinge | 0.9439
| 0.8060 | 0.7876224517822266
|
binary_crossentropy | 0.9981
| 0.9917
| 0.9910275340080261
|
categorical_crossentropy | 0.9572
| 0.8050
| 0.7920747995376587
|
由此可知binary_crossentropy作为损失函数效果更好,无论在训练集、验证集还是在测试集上精度都远远领先。