lstm代码java lstm代码中的激活函数

如何自定义LSTM的initial stateState 不是 Tuple 时,代码如下 。一个epoch的最开始,我们要把一个 全零array , 输入到 initial_state 中,然后输出 finial_state 覆盖到 state 中,然后执行下一个迭代 。
但是当LSTM设置为 state is tuple, TensorFlow是返回一个LSTMStateTuple的,是不可以通过eval() 来得到参数的,而且也不能被feed?。?
如何在Python中用LSTM网络进行时间序列预测时间序列模型
时间序列预测分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征 。这是一类相对比较复杂的预测建模问题 , 和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的 。
举个栗子:根据过去两年某股票的每天的股价数据推测之后一周的股价变化;根据过去2年某店铺每周想消费人数预测下周来店消费的人数等等
RNN 和 LSTM 模型
时间序列模型最常用最强大的的工具就是递归神经网络(recurrent neural network, RNN) 。相比与普通神经网络的各计算结果之间相互独立的特点,RNN的每一次隐含层的计算结果都与当前输入以及上一次的隐含层结果相关 。通过这种方法,RNN的计算结果便具备了记忆之前几次结果的特点 。
典型的RNN网路结构如下:
右侧为计算时便于理解记忆而产开的结构 。简单说,x为输入层,o为输出层 , s为隐含层 , 而t指第几次的计算;V,W,U为权重 , 其中计算第t次的隐含层状态时为St = f(U*Xt + W*St-1),实现当前输入结果与之前的计算挂钩的目的 。对RNN想要更深入的了解可以戳这里 。
【lstm代码java lstm代码中的激活函数】RNN的局限:
由于RNN模型如果需要实现长期记忆的话需要将当前的隐含态的计算与前n次的计算挂钩,即St = f(U*Xt + W1*St-1 + W2*St-2 + ... + Wn*St-n),那样的话计算量会呈指数式增长,导致模型训练的时间大幅增加 , 因此RNN模型一般直接用来进行长期记忆计算 。
LSTM模型
LSTM(Long Short-Term Memory)模型是一种RNN的变型 , 最早由Juergen Schmidhuber提出的 。经典的LSTM模型结构如下:
LSTM的特点就是在RNN结构以外添加了各层的阀门节点 。阀门有3类:遗忘阀门(forget gate),输入阀门(input gate)和输出阀门(output gate) 。这些阀门可以打开或关闭 , 用于将判断模型网络的记忆态(之前网络的状态)在该层输出的结果是否达到阈值从而加入到当前该层的计算中 。如图中所示 , 阀门节点利用sigmoid函数将网络的记忆态作为输入计算;如果输出结果达到阈值则将该阀门输出与当前层的的计算结果相乘作为下一层的输入(PS:这里的相乘是在指矩阵中的逐元素相乘);如果没有达到阈值则将该输出结果遗忘掉 。每一层包括阀门节点的权重都会在每一次模型反向传播训练过程中更新 。更具体的LSTM的判断计算过程如下图所示:
LSTM模型的记忆功能就是由这些阀门节点实现的 。当阀门打开的时候,前面模型的训练结果就会关联到当前的模型计算,而当阀门关闭的时候之前的计算结果就不再影响当前的计算 。因此,通过调节阀门的开关我们就可以实现早期序列对最终结果的影响 。而当你不不希望之前结果对之后产生影响,比如自然语言处理中的开始分析新段落或新章节,那么把阀门关掉即可 。(对LSTM想要更具体的了解可以戳这里)
下图具体演示了阀门是如何工作的:通过阀门控制使序列第1的输入的变量影响到了序列第4,6的的变量计算结果 。

推荐阅读