天天看点

TensorFlow入门(五)多层 LSTM 通俗易懂版 1. 首先设置好模型用到的各个超参数 2. 开始搭建 LSTM 模型,其实普通 RNNs 模型也一样 3. 设置 loss function 和 优化器,展开训练并完成测试 4. 可视化看看 LSTM 的是怎么做分类的 5. 附:BASICLSTM.__call__()

前言: 根据我本人学习 TensorFlow 实现 LSTM 的经历,发现网上虽然也有不少教程,其中很多都是根据官方给出的例子,用多层 LSTM 来实现 PTBModel 语言模型,比如: 

但是感觉这些例子还是太复杂了,所以这里写了个比较简单的版本,虽然不优雅,但是还是比较容易理解。

如果你想了解 LSTM 的原理的话(前提是你已经理解了普通 RNN 的原理),可以参考我前面翻译的博客: 

<a href="http://blog.csdn.net/jerr__y/article/details/58598296" target="_blank">(译)理解 LSTM 网络 (Understanding LSTM Networks by colah)</a>

如果你想了解 RNN 原理的话,可以参考 AK 的博客: 

<a href="http://karpathy.github.io/2015/05/21/rnn-effectiveness/" target="_blank">The Unreasonable Effectiveness of Recurrent Neural Networks</a>

很多朋友提到多层怎么理解,所以自己做了一个示意图,希望帮助初学者更好地理解 多层RNN.

TensorFlow入门(五)多层 LSTM 通俗易懂版 1. 首先设置好模型用到的各个超参数 2. 开始搭建 LSTM 模型,其实普通 RNNs 模型也一样 3. 设置 loss function 和 优化器,展开训练并完成测试 4. 可视化看看 LSTM 的是怎么做分类的 5. 附:BASICLSTM.__call__()

图1 3层RNN按时间步展开

本例不讲原理。通过本例,你可以了解到单层 LSTM 的实现,多层 LSTM 的实现。输入输出数据的格式。 RNN 的 dropout layer 的实现。

<a></a>

我们一共只迭代不到5个epoch,在测试集上就已经达到了0.9825的准确率,可以看出来 LSTM 在做这个字符分类的任务上还是比较有效的,而且我们最后一次性对 10000 张测试图片进行预测,才占了 725 MiB 的显存。而我们在之前的两层 CNNs 网络中,预测 10000 张图片一共用了 8721 MiB 的显存,差了整整 12 倍呀!! 这主要是因为 RNN/LSTM 网络中,每个时间步所用的权值矩阵都是共享的,可以通过前面介绍的 LSTM 的网络结构分析一下,整个网络的参数非常少。

毕竟 LSTM 更多的是用来做时序相关的问题,要么是文本,要么是序列预测之类的,所以很难像 CNNs 一样非常直观地看到每一层中特征的变化。在这里,我想通过可视化的方式来帮助大家理解 LSTM 是怎么样一步一步地把图片正确的给分类。

看下面我找了一个字符 3

我们先来看看这个字符样子,上半部分还挺像 2 来的

TensorFlow入门(五)多层 LSTM 通俗易懂版 1. 首先设置好模型用到的各个超参数 2. 开始搭建 LSTM 模型,其实普通 RNNs 模型也一样 3. 设置 loss function 和 优化器,展开训练并完成测试 4. 可视化看看 LSTM 的是怎么做分类的 5. 附:BASICLSTM.__call__()

我们看看在分类的时候,一行一行地输入,分为各个类别的概率会是什么样子的。

TensorFlow入门(五)多层 LSTM 通俗易懂版 1. 首先设置好模型用到的各个超参数 2. 开始搭建 LSTM 模型,其实普通 RNNs 模型也一样 3. 设置 loss function 和 优化器,展开训练并完成测试 4. 可视化看看 LSTM 的是怎么做分类的 5. 附:BASICLSTM.__call__()

在上面的图中,为了更清楚地看到线条的变化,我把坐标都去了,每一行显示了 4 个图,共有 7 行,表示了一行一行读取过程中,模型对字符的识别。可以看到,在只看到前面的几行像素时,模型根本认不出来是什么字符,随着看到的像素越来越多,最后就基本确定了它是字符 3.

好了,本次就到这里。有机会再写个优雅一点的例子,哈哈。其实学这个 LSTM 还是比较困难的,当时写 多层 CNNs 也就半天到一天的时间基本上就没啥问题了,但是这个花了我大概整整三四天,而且是在我对原理已经很了解(我自己觉得而已。。。)的情况下,所以学会了感觉还是有点小高兴的~

17-04-19补充几个资料: