这章是为了让人体验深度神经网络而设置,根据题目要求组合出来的神经网络,进行一下训练,熟悉一下一般的机器学习科研(调参)流程。
因而笔者建议在这部分更加侧重于学习每种神经网络层的作用以及区别,例如Loss
函数、激活函数、不同的梯度下降法对训练网络的影响。
常用的神经网络层有全连接层、循环层、卷积层以及经常配套出现的池化层等。
题目6.1 - 卷积神经网络
该章所用的数据集就是常用的MNIST
手写数字数据集:
- 数据集每个样本都是
28*28
的矩阵存储,展开为一维向量时则有784
个属性 - 样本的分类使用布尔值向量表示,如结果为
3
的
第一问是使用经典的线性层来训练,其中参数:
- 学习率
- 使用
Cross Entropy
作为损失函数 - 随机梯度下降作为参数优化方法
- 数据批处理大小
,训练
由于10000个Epochs对于笔者的个人电脑来说压力太大了,训练起来太久了,于是偷个懒设置成1000了,虽然可以使用GPU加速,但是这样会与笔者的GeForce驱动冲突,于是也懒得用cuDNN了。
训练过程中的精度和Loss变化:
第二问是使用三层线性成组成多层网络,参数:
同样设置20个Epochs就好了,笔者电脑吃不消。
第三问在相邻的隐藏层间插入Dropout
层,参数:
- 随机断开连接的几率设置为
0.5
其余参数与上一问一样,重复实验。
第四问轮到大名鼎鼎的卷积层CNN出场,这部分的参数较为复杂,所幸的是这里学习的问题在TensorFlow官网上的配置基本是一致的。
参数方面,卷积层:
- 卷积核的大小为
5*5
,因为每张图像原始大小为28*28
,经过卷积后变成了24*24
- 填充策略
padding='same'
卷积层1
的feature maps
为32
,即参数filter=32
,卷积层2
则为64
- 默认使用
bias=TRUE
- 使用
ReLU
作为激活函数
池化层采用最大池化层:
- 池化大小
pool_size=2
,事实上应该是pool_size=c(2,2)
,代表每2*2
局部图像抽取其中最大值成一个像素 - 跨幅
strides=2
,即每次池化后选取下一个池化区域的步长,例如池化大小为2
时,第一次池化图像的坐标(0,0),(0,1),(1,0),(1,1)
,那下一个为(0,2),(0,3),(1,2),(1,3)
损失函数使用交叉熵Cross-Entropy
,Adam
作为优化器。
最后一问就是比较前几问的模型,使用100
个Epochs对比它们的效果,包括过拟合现象等比较,笔者在这里就不多介绍了,机器快烧了。
题目6.2 - LSTM网络
第一问是准备数据,数据样本有如下特征:
- 10000组数据,每组数据为长度30的序列
, 为整数 - 当序列和不小于
100
时,对应的标签,否则为0 - 其中8000组作为训练集,2000组作为验证集
产生了数据集之后,第二问自然就是构建一个LSTM网络并且用上述的数据集训练了。
LSTM网络参数:
- 输入为长度30的1维序列
- 有200个输出单元
- 使用
logistic sigmoidal
作为激活函数 cross entropy
作为损失函数- 添加一层线性层,将上一层的LSTM的200个输出拟合为一个
0-1
的输出
于是笔者实验出了一个神奇的ACC-LOSS
图像:
笔者不能理解这个突跃是什么情况,日后有机会问到大佬给出解释之后再说吧。
剩下的问题就是修改一下参数跑实验,对比一下不同点,笔者就不再赘述了。
至此第六章的习题结束。