天天看點

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補充幾個資料: