# 堆疊多個 LSTM 層
正如我們可以增加神經網絡或 CNN 的深度,我們可以增加 RNN 網絡的深度。在這個秘籍中,我們應用了一個三層深度的 LSTM 來改進我們的莎士比亞語言生成。
## 做好準備
我們可以通過將它們疊加在一起來增加循環神經網絡的深度。從本質上講,我們將獲取目標輸出并將其輸入另一個網絡。
要了解這對于兩層的工作原理,請參見下圖:

圖 5:在上圖中,我們擴展了單層 RNN,使它們具有兩層。對于原始的單層版本,請參閱上一章簡介中的繪圖。左側架構說明了使用多層 RNN 預測輸出序列中的一個輸出的方法。正確的架構顯示了使用多層 RNN 預測輸出序列的方法,該輸出序列使用輸出作為輸入
TensorFlow 允許使用`MultiRNNCell()`函數輕松實現多個層,該函數接受 RNN 單元列表。有了這種行為,很容易用`MultiRNNCell([rnn_cell(num_units) for n in num_layers])`單元格從 Python 中的一個單元格創建多層 RNN。
對于這個秘籍,我們將執行我們在之前的秘籍中執行的相同的莎士比亞預測。將有兩個變化:第一個變化將是具有三個堆疊的 LSTM 模型而不是僅一個層,第二個變化將是進行字符級預測而不是單詞。進行字符級預測會將我們潛在的詞匯量大大減少到只有 40 個字符(26 個字母,10 個數字,1 個空格和 3 個特殊字符)。
## 操作步驟
我們將說明本節中的代碼與上一節的不同之處,而不是重新使用所有相同的代碼。有關完整代碼,請參閱 [https://github.com/nfmcclure/tensorflow_cookbook](https://github.com/nfmcclure/tensorflow_cookbook) 上的 GitHub 倉庫或 [https://github.com/PacktPublishing/TensorFlow-Machine-的 Packt 倉庫 Learning-Cookbook-Second-Edition](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition) 。
1. 我們首先需要設置模型的層數。我們將此作為參數放在腳本的開頭,并使用其他模型參數:
```py
num_layers = 3
min_word_freq = 5
```
```py
rnn_size = 128
epochs = 10
```
1. 第一個主要變化是我們將按字符加載,處理和提供文本,而不是按字詞加載。為了實現這一點,在清理文本之后,我們可以使用 Python 的`list()`命令逐個字符地分隔整個文本:
```py
s_text = re.sub(r'[{}]'.format(punctuation), ' ', s_text)
s_text = re.sub('s+', ' ', s_text ).strip().lower()
# Split up by characters
char_list = list(s_text)
```
1. 我們現在需要更改 LSTM 模型,使其具有多個層。我們接受`num_layers`變量并使用 TensorFlow 的`MultiRNNCell()`函數創建一個多層 RNN 模型,如下所示:
```py
class LSTM_Model():
def __init__(self, rnn_size, num_layers, batch_size, learning_rate,
training_seq_len, vocab_size, infer_sample=False):
self.rnn_size = rnn_size
self.num_layers = num_layers
self.vocab_size = vocab_size
self.infer_sample = infer_sample
self.learning_rate = learning_rate
...
self.lstm_cell = tf.contrib.rnn.BasicLSTMCell(rnn_size)
self.lstm_cell = tf.contrib.rnn.MultiRNNCell([self.lstm_cell for _ in range(self.num_layers)])
self.initial_state = self.lstm_cell.zero_state(self.batch_size, tf.float32)
self.x_data = tf.placeholder(tf.int32, [self.batch_size, self.training_seq_len])
self.y_output = tf.placeholder(tf.int32, [self.batch_size, self.training_seq_len])
```
> 請注意,TensorFlow 的`MultiRNNCell()`函數接受 RNN 單元列表。在這個項目中,RNN 層都是相同的,但您可以列出您希望堆疊在一起的任何 RNN 層。
1. 其他一切基本相同。在這里,我們可以看到一些訓練輸出:
```py
Building Shakespeare Vocab by Characters
Vocabulary Length = 40
Starting Epoch #1 of 10
Iteration: 9430, Epoch: 10, Batch: 889 out of 950, Loss: 1.54
Iteration: 9440, Epoch: 10, Batch: 899 out of 950, Loss: 1.46
Iteration: 9450, Epoch: 10, Batch: 909 out of 950, Loss: 1.49
thou art more than the
to be or not to the serva
wherefore art thou dost thou
Iteration: 9460, Epoch: 10, Batch: 919 out of 950, Loss: 1.41
Iteration: 9470, Epoch: 10, Batch: 929 out of 950, Loss: 1.45
Iteration: 9480, Epoch: 10, Batch: 939 out of 950, Loss: 1.59
Iteration: 9490, Epoch: 10, Batch: 949 out of 950, Loss: 1.42
```
1. 以下是最終文本輸出的示例:
```py
thou art more fancy with to be or not to be for be wherefore art thou art thou
```
1. 最后,以下是我們如何繪制幾代的訓練損失:
```py
plt.plot(train_loss, 'k-')
plt.title('Sequence to Sequence Loss')
plt.xlabel('Generation')
plt.ylabel('Loss')
plt.show()
```

圖 6:多層 LSTM 莎士比亞模型的訓練損失與世代的關系圖
## 工作原理
TensorFlow 只需一個 RNN 單元列表即可輕松將 RNN 層擴展到多個層。對于這個秘籍,我們使用與上一個秘籍相同的莎士比亞數據,但是用字符而不是單詞處理它。我們通過三層 LSTM 模型來生成莎士比亞文本。我們可以看到,在僅僅 10 個周期之后,我們就能夠以文字的形式產生古老的英語。
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras