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