学习概述
- 学习了一维卷积的原理及特点
- Keras API的用法
- 深度学习的模型提升方法
一维卷积
卷积运算可以从输入数据中提取局部特征,二维三维卷积运算在计算机视觉上表现优越。一维卷积则在序列问题上表现不错,它的原理如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqiBhzgw-1583149209612)(./一维卷积原理.png)]
一维卷积在某些问题上的效果可以媲美RNN,并且计算代价和参数量都小很多。它对卷积窗口的数据做点积运算,提取局部特征,由于具有平移不变形,它在某个位置上学习得到的特征可以在其他位置上被识别。
一维卷积同样具有池化操作,使用MaxPooling1D和AveragePooling1D完成最大池化和平均池化。由于RNN在处理长序列时的计算代价很大,可以在RNN之前使用一维卷积将长序列处理成短序列,较小运算代价。
Keras API
采用Sequential函数只能构建线性堆叠的神经网络,构建多输入、多输出、多分支、残差神经网络时需要使用Keras的函数式API。
多输入网络需要使用concatenate样例:
from keras.layers import concatenate
concatenated_data = concatenate([input_1, input_2],axis=-1)
多输出网络多多重损失,它的重点在于损失函数的合并,比如预测一个人的年龄、收入、性别,需要使用均方误差,多分类和二分类交叉熵,还可以为其指定权重,损失函数计算如下:
model.compile(
optimizer='rmsprop',
loss={'age': 'mse',
'income': 'categorical_crossentropy',
'gender': 'binary_crossentropy'},
loss_weights={'age':0.25,
'income':1,
'gender':10})
共享权重层在某些场合下非常有用,比如对比两张图片的相似度,前面几层网络可以共享,共享方法如下所示:
from keras import layers
from keras import Input
lstm = layers.LSTM(32) #实例化LSTM层
left_input = Input(shape=(None, 128)) #左分支使用LSTM实例层
left_output = lstm(left_input)
right_input = Input(shape=(None, 128)) #左分支使用LSTM实例层
right_output = lstm(right_input)
同时,Keras 还支持将模型作为层,有利于模型的嵌套和加深
模型提升方法
深度学习在模型训练过程中有许多优化方法,比如:
- 批标准化。批标准化层一般添加在激活函数之前。标准化处理后使得输出的数据均值为0,方差为1,而批标准化增加了反标准化操作,通过缩放和平移更有利于模型寻找最优解。参考链接
- 批再标准化。有学者提出批再标准化的想法,它使用特殊的激活函数(selu)和初始化函数(lecun_normal),能够让数据警告任何Dense层之后保持数据标准化,但有效性尚未得到大规模重复。
- 深度可分离卷积。深度可分离卷积是对每个通道分别做卷积,然后使用Conv1D将输出通道混合。这样做非常有意义,将通道特征独立时这样做非常有意义,可以减小参数量、增快训练速度,提到模型效果,应用用Xception网络中。参考链接
- 超参数优化。超参数优化需要采用迭代的方法,选择合适超参数后不断验证并调节。超参数调节方法有贝叶斯优化、遗传算法、简单随机搜索等。通常情况下随机搜索可以得到更好的超参数,Hyperas库通过Parzen树预测哪组超参数会取得更好的效果,比随机搜索效果更好,使用方法见参考链接。需要注意的是使用Hyperas库容易对验证机过拟合,因为它是根据验证集效果选择超参数的。
- 模型集成。模型集成是提升效果的强大技术,将一系列不同的模型汇集到一起,集成方法最重要的是模型尽可能好,但是尽可能不同。比较常见的集成方法有bagging、boosting 、stacking等等,参考这里