准备写个系列博客介绍机器学习实战中的部分公开项目。首先从初级项目开始。
本文对机器学习实战三个初级项目中涉及的神经网络算法以及基于Keras的神经网络语法进行总结。
三个初级项目分别为:
第一篇:机器学习实战 | emojify 使用Python创建自己的表情符号(深度学习初级)
第二篇:机器学习实战 | MNIST手写数字分类项目(深度学习初级)
第三篇:机器学习实战 | 股票价格预测项目(深度学习初级)
这三个初级项目中分别用了卷积神经网络CNN和长短期记忆神经网络LSTM。此外,为了更好的解释LSTM神经网络,这里还给出了LSTM网络的基础——循环神经网络RNN的介绍。
因此本文共介绍CNN、RNN和LSTM这三种神经网络的特点和用法。
参考网址:
卷积神经网络与普通神经网络的区别在于,卷积神经网络包含了一个由卷积层和子采样层构成的特征抽取器。
在卷积神经网络的卷积层中,一个神经元只与部分邻层神经元连接。
在CNN的一个卷积层中,通常包含若干个特征平面(featureMap),每个特征平面由一些矩形排列的的神经元组成,同一特征平面的神经元共享权值,这里共享的权值就是卷积核。
卷积核一般以随机小数矩阵的形式初始化,在网络的训练过程中卷积核将学习得到合理的权值。
共享权值(卷积核)带来的直接好处是减少网络各层之间的连接,同时又降低了过拟合的风险。
子采样也叫做池化(pooling),通常有均值子采样(mean pooling)和最大值子采样(max pooling)两种形式。子采样可以看作一种特殊的卷积过程。卷积和子采样大大简化了模型复杂度,减少了模型的参数。
当输入图像被送入卷积神经网络后,先后要循环通过卷积层、激励层和池化层,最后从全连接层输出分类结果。除了卷积层,卷积网络通常也以池化层(pooling layer)为特色。
输入层
输入数据,通常会做一些数据处理,例如去均值、归一化等。
卷积层
卷积层是卷积神经网络的核心部分,参数是一个或多个随机初始化的核函数,核函数就像按照灯一样,逐行逐列扫描输入图像。
扫描完毕后计算出的所有卷积结果可以构成一个矩阵,这个新的矩阵叫特征映射(feature map)。卷积层得到的特征一般会送到激励层处理。
激励层
主要作用是将卷积层的结果做非线性映射。
常见的激励层函数有sigmoid、tanh、Relu、Leaky Relu、ELU、Maxout。
池化层
在连续的卷基层和激励层中间,用于压缩数据和参数的量,用于减少过拟合。
简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。
常见的最大池化做法就是将特征映射划分为若干个矩形区域,挑选每个区域中的最大值。
全连接层
两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部,输出分类结果。
卷积神经网络的作用是逐层提取输入对象的特征,训练采用的也是反向传播的方法,参数的不断更新能够提升图像特征提取的精度。
卷积神经网络主要是用于图像处理,也可以用于其他数据类型的处理,如音频文件。
卷积神经网络具有空间上的参数共享的特性,可以让同样的核函数应用在图像的不同区域。输出时只考虑前一个输入的影响,而不考虑不同时刻输入的影响。
把参数共享调整到时间维度上,让神经网络使用相同权重系数来处理具有先后顺序的数据,得到的就是循环神经网络。
循环神经网络(Recurrent Neural Network),也可以表示递归神经网络(Recursive Neural Network)。
时间
循环神经网络引入了“时间”的维度,适用于处理时间序列类型的数据。
循环神经网络就是将长度不定的输入分割为等长的小块,再使用相同的权重系统进行处理,从而实现对变长输入的计算与处理。
记忆
循环神经网络t时刻的输出取决于当前时刻的输入,也取决于网络前一时刻t-1
甚至更早的输出。
从这个意义上来讲,循环神经网络引入了反馈机制,因而具有了记忆功能。
记忆功能使循环神经网络能够提取来自序列自身的信息,输入序列的内部信息存储在神经网络的隐藏层中,并随着时间的推移在隐藏层中流转。
RNN的基本结构包括输入层、隐藏层和输出层。
隐藏层的状态会随时间步更新,并作为下一时间的输入之一。
这种循环连接使得RNN具有记忆能力,能够捕捉序列中数据的依赖关系。
RNN是一种专门处理序列数据的神经网络结构,它的特点是具有循环连接,能够在网络中传递信息,从而捕捉序列中的时序依赖关系。
RNN可用于处理文本数据、时间序列数据、语音信号等。
RNN通过在时间共享参数引入了记特性,从而可以将先前的信息应用在当前的任务上,可是这种记忆通常只有有限的深度。
长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的。
LSTM可以像人的记忆中选择性地记住一些时间间隔更久远的信息,它会根据组成元素的特性,来判断不同信息是被遗忘或被记住继续传递下去。
LSTM就是实现长期记忆用的,实现任意长度的记忆。要求模型具备对信息价值的判断能力,结合自身确定哪些信息应该保存,哪些信息该舍弃,元还要能决定哪一部分记忆需要立刻使用。
记忆细胞(memory cell)
作用是存储数值或状态,存储的时限可以是长期也可以是短期
输入门(input gate)
决定哪些信息在记忆细胞中存储
遗忘门(forget gate)
决定哪些信息从记忆细胞中丢弃
输出门(output gate)
决定哪些信息从记忆细胞中输出
由于独特的设计结构,LSTM适合于处理和预测时间序列中间隔和延迟非常长的重要事件。
序贯型神经网络搭建-编译-训练全流程:
from keras.models import Sequential
from keras.layers import LSTM, Dropout, Dense
x_train = ***
y_train = ***
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
"""
往下可以继续接神经网络结构。。。
"""
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)
model.save("saved_model.h5")
Sequential
: 序贯模型,与函数式模型对立。from keras.models import Sequential, 序贯模型通过一层层神经网络连接构建深度神经网络。
add
: 叠加网络层,输入参数可选为:
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train_data.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
complie
: 编译神经网络结构,输入参数包括:
model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)
fit
: 在搭建完成后,将数据送入模型进行训练。输入参数包括:
# 用法一
model.save("saved_model.h5")
# 用法二
model.save_weights('emotion_model.h5')
save
: 保存训练模型权重,训练成功后,会在源目录下保存***.h5
文件,即为权重文件。
model.predict(x_test)
predict
:利用训练好的模型权重lstm_model,对测试数据进行预测。