lstm代码java lstm代码中的激活函数( 二 )


黑色实心圆代表对该节点的计算结果输出到下一层或下一次计算;空心圆则表示该节点的计算结果没有输入到网络或者没有从上一次收到信号 。
Python中实现LSTM模型搭建
Python中有不少包可以直接调用来构建LSTM模型,比如pybrain, kears, tensorflow, cikit-neuralnetwork等(更多戳这里) 。这里我们选用keras 。(PS:如果操作系统用的linux或者mac,强推Tensorflow?。。。?
因为LSTM神经网络模型的训练可以通过调整很多参数来优化,例如activation函数,LSTM层数 , 输入输出的变量维度等 , 调节过程相当复杂 。这里只举一个最简单的应用例子来描述LSTM的搭建过程 。
应用实例
基于某家店的某顾客的历史消费的时间推测该顾客前下次来店的时间 。具体数据如下所示:
消费时间
2015-05-15 14:03:512015-05-15 15:32:462015-06-28 18:00:172015-07-16 21:27:182015-07-16 22:04:512015-09-08 14:59:56..
..
具体操作:
1. 原始数据转化
首先需要将时间点数据进行数值化 。将具体时间转化为时间段用于表示该用户相邻两次消费的时间间隔 , 然后再导入模型进行训练是比较常用的手段 。转化后的数据如下:
消费间隔04418054..
..
2.生成模型训练数据集(确定训练集的窗口长度)
这里的窗口指需要几次消费间隔用来预测下一次的消费间隔 。这里我们先采用窗口长度为3 ,  即用t-2, t-1,t次的消费间隔进行模型训练,然后用t+1次间隔对结果进行验证 。数据集格式如下:X为训练数据,Y为验证数据 。
PS: 这里说确定也不太合适,因为窗口长度需要根据模型验证结果进行调整的 。
X1X2X3Y0441804418054..
..
注:直接这样预测一般精度会比较差 , 可以把预测值Y根据数值bin到几类,然后用转换成one-hot标签再来训练会比较好 。比如如果把Y按数值范围分到五类(1:0-20,2:20-40,3:40-60 , 4:60-80,5:80-100)上式可化为:
X1X2X3Y044180441804...
Y转化成one-hot以后则是(关于one-hot编码可以参考这里)
1000000001...
3. 网络模型结构的确定和调整
这里我们使用python的keras库 。(用java的同学可以参考下deeplearning4j这个库) 。网络的训练过程设计到许多参数的调整:比如
需要确定LSTM模块的激活函数(activation fucntion)(keras中默认的是tanh);
确定接收LSTM输出的完全连接人工神经网络(fully-connected artificial neural network)的激活函数(keras中默认为linear);
确定每一层网络节点的舍弃率(为了防止过度拟合(overfit)),这里我们默认值设定为0.2;
确定误差的计算方式 , 这里我们使用均方误差(mean squared error);
确定权重参数的迭代更新方式,这里我们采用RMSprop算法,通常用于RNN网络 。
确定模型训练的epoch和batch size(关于模型的这两个参数具体解释戳这里)
一般来说LSTM模块的层数越多(一般不超过3层,再多训练的时候就比较难收敛),对高级别的时间表示的学习能力越强;同时,最后会加一层普通的神经网路层用于输出结果的降维 。典型结构如下:
如果需要将多个序列进行同一个模型的训练,可以将序列分别输入到独立的LSTM模块然后输出结果合并后输入到普通层 。结构如下:
4. 模型训练和结果预测
将上述数据集按4:1的比例随机拆分为训练集和验证集,这是为了防止过度拟合 。训练模型 。然后将数据的X列作为参数导入模型便可得到预测值,与实际的Y值相比便可得到该模型的优劣 。
实现代码
时间间隔序列格式化成所需的训练集格式

推荐阅读