1. rnn的相关简单代码
from tensorflow.models.rnn import rnn改为
import tensorflow.contrib.rnn as rnn
rnn.rnn(cell, inputs, initial_state=self._initial_state)改为
rnn.static_rnn(cell, inputs, initial_state=self._initial_state)
tf.reshape(tf.concat(outputs,1), [-1, size])。
reshape中-1表示该维度的尺寸是从其它维度推算出来。
concat表示沿指定的维度重新拼接矩阵。
t1 = [[1, 2, 3], [4, 5, 6]]
t2 = [[7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 0) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
tf.concat([t1, t2], 1) # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
state = m.initial_state.eval()
tf.Session().run() 与 Tensor.eval():假设 x 为 tf 下的一个 Tensor 对象,t.eval() 执行的动作就是 tf.Session().run(t) 。
import tensorflow as tf
x = tf.constant([5.])
print(tf.Session().run(x))
with tf.Session():
print(x.eval())
2. LSTM时间序列预测的资源
2.1 2017820前
- 深度学习(08)_RNN-LSTM循环神经网络-03-Tensorflow进阶实现
- http://blog.csdn.net/u013082989/article/details/73693392 Applying
- Deep Learning to Time Series Forecasting with TensorFlow
- https://mapr.com/blog/deep-learning-tensorflow/ Tensorflow 笔记 RNN
- 预测时间序列 https://www.v2ex.com/t/339544 tf19: 预测铁路客运量
- http://blog.csdn.net/u014365862/article/details/53869802
2.2 LSTM介绍的博客
- CSDN关于LSTM的博客,目录中还有优化方法总结,Encoder模型,Attention模型
- CSDN关于多层LSTM博客,讲解比较细,并建议了正则化的阅读论文,目录中还有模型的保存与训练可视化
- RNN Regularization 论文
- 老外写的正弦波预测代码,用到了Estimator,learn.monitor,其中还有代码下载。
- 上面博客中的代码,带有天气预测
3. LSTM理解博文阅读
- RNN简单结构图。
- 长期依赖使得训练很困难,Bengio分析其中根本原因,在这篇论文中分析了原因
- LSTM网络,Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由 Hochreiter & Schmidhuber (1997) 提出,并在近期被 Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
1)标准的RNN
2)LSTM结构
图中图标元素的含义:
细胞状态:
门结构,一个细胞中共有3个这种门,用来在细胞之间传递状态:
门的数学计算公式:
其输入为h(t-1), x(t),输出为0-1之间的遗忘因子,再与信息相乘,得到遗忘后的信息。
总结一下LSTM的关键数学公式,要多背!!
ft=σ(Wf∗[ht−1,xt]+bf)it=σ(Wi∗[ht−1,xt]+bi)C~t=tanh(WC∗[ht−1,xt]+bC)Ct=ft∗Ct−1+it∗C~tot=σ(Wo∗[ht−1,xt]+bo)ht=ot∗tanh(Ct)
总结一下:一个细胞三个门六个公式
3)LSTM的变体 - Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”
- coupled 忘记和输入门, Ct=ft∗Ct−1+(1−ft)∗C~t
- Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。
- Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出
Jozefowicz, et al. (2015) 则在超过 1 万中 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。
4)注意力(attention)、Grid LSTM、生成模型RNN有可能是未来的突破。注意力LSTM、Grid LSTM、生成模型RNN
4. 多层LSTM博文理解
4.1 DropoutWrapper
if is_training and config.keep_prob < 1: # 在外面包裹一层dropout
lstm_cell = tf.nn.rnn_cell.DropoutWrapper(
lstm_cell, output_keep_prob=config.keep_prob)
所谓dropout,就是指网络中每个单元在每次有数据流入时以一定的概率(keep prob)正常工作,否则输出0值。这是是一种有效的正则化方法,可以有效防止过拟合。在rnn中使用dropout的方法和cnn不同。
在rnn中进行dropout时,对于rnn的部分不进行dropout,也就是说从t-1时候的状态传递到t时刻进行计算时,这个中间不进行memory的dropout;仅在同一个t时刻中,多层cell之间传递信息的时候进行dropout,如下图所示:
上图中,t-2时刻的输入xt−2首先传入第一层cell,这个过程有dropout,但是从t−2时刻的第一层cell传到t−1,t,t+1的第一层cell这个中间都不进行dropout。再从t+1时候的第一层cell向同一时刻内后续的cell传递时,这之间又有dropout了。
4.2 梯度修剪
tf.clip_by_global_norm ,修正梯度值,用于控制梯度爆炸的问题。梯度爆炸和梯度弥散的原因一样,都是因为链式法则求导的关系,导致梯度的指数级衰减。为了避免梯度爆炸,需要对梯度进行修剪。
进一步上式可写为,可以看出大于Nc就开始修剪:
其它
其实一个in-graph就是模型并行,将模型中不同节点分布式地运行;between-graph就是数据并行,同时训练多个batch的数据。要针对神经网络结构来设计,模型并行实现难度较大,而且需要网络中天然存在很多可以并行的节点。因此一般用数据并行的比较多。
会集成越来越多的contrib模块,添加很多方便的上层接口,支持更多的语言绑定。同时新推出的XLA(JIT编译器),Fold(Dynamics Batching)都是未来的大方向。
XLA会对几个层叠的操作进行JIT编译。cuda是一门语言,cudnn是深度学习的库,使用cuda加速也要看是怎么使用它加速,是一层计算执行一次,还是把几层的计算合并在一起执行,XLA做的就是这个,将一些简单的操作编译合并成一个操作。此前TensorFlow训练MLP等网络较慢,使用XLA后有。
黄文坚: Google内部非常多team在使用tensorflow,比如搜索、邮件、语音、机器翻译等等。数据越大,深度学习效果越好,而支持分布式的tensorflow就能发挥越大的作用。 6个月前
唐源Terry: 应用非常广的,谷歌已经在很多项目上用了TensorFlow,比如说Youtube watch next,还有很多研究型的项目,谷歌DeepMind以后所有的研究都会使用这个框架。如果对某段代码好奇,可以去参考参考源代码学习学习,很多的设计都是经过内部各种项目和用户的千锤百炼。