使用GRU单元的RNN模型生成唐诗
生活随笔
收集整理的這篇文章主要介紹了
使用GRU单元的RNN模型生成唐诗
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 讀取數據
- 2. 字符索引
- 3. 創建文本序列
- 4. 創建文本編碼序列
- 5. 使用GRU單元建立RNN模型
- 6. 文本生成
參考 基于深度學習的自然語言處理
本文使用 GRU 單元建立 RNN 網絡,使用唐詩三百首進行訓練,使用模型生成唐詩。
GRU RNN 網絡能夠克服簡單RNN網絡的一些問題,如梯度消失,梯度很難從深層傳遞到淺層,導致淺層的參數更新非常緩慢,學習速度很慢,還導致深層淺層學習不均衡。
GRU,LSTM 使用更新門,遺忘門,來解決長距離的依賴關系,GRU相比LSTM參數更少。
RNN 網絡的還有缺點就是無法采用并行計算,必須在上一個時間步的基礎上計算下一個時間步。
1. 讀取數據
# 讀取文本 file = "tangshi300.txt" with open(file,'r',encoding='utf-8') as f:text = f.read() print(len(text)) print(text[:180])輸出:
29405 # 文本長度唐詩300首 1-50010杜甫:佳人絕代有佳人,幽居在空谷。 自云良家子,零落依草木。 關中昔喪亂,兄弟遭殺戮。 官高何足論,不得收骨肉。 世情惡衰歇,萬事隨轉燭。 夫婿輕薄兒,新人美如玉。 合昏尚知時,鴛鴦不獨宿。 但見新人笑,那聞舊人哭! 在山泉水清,出山泉水濁。 侍婢賣珠回,牽蘿補茅屋。 摘花不插發,采柏動盈掬。 天寒翠袖薄,日暮倚修竹。2. 字符索引
# 創建字符序號索引 words = sorted(list(set(text))) print("字和符號數量:{}".format(len(words)))word_idx = {w : i for (i, w) in enumerate(words)} idx_word = {i : w for (i, w) in enumerate(words)}輸出:
字和符號數量:25903. 創建文本序列
# 根據文本,創建序列 sample_maxlen = 40 # 樣本句子長度 sentences = [] next_word = [] for i in range(len(text)-sample_maxlen):sentences.append(text[i : i+sample_maxlen]) # 滑窗取出樣本句子next_word.append(text[i+sample_maxlen]) # 句子末尾的下一個字 print("樣本數量:{}".format(len(sentences))) 樣本數量:293654. 創建文本編碼序列
# 將文本序列轉化成數字序列(矩陣), 實際上就是一個one_hot 編碼 import numpy as np X = np.zeros((len(sentences), sample_maxlen, len(words)), dtype=np.bool) # 樣本數 1個樣本字個數 一個字的OH編碼長度 y = np.zeros((len(sentences), len(words)), dtype=np.bool) # 樣本數 一個字的OH編碼長度 for i in range(len(sentences)):for t, w in enumerate(sentences[i]):X[i, t, word_idx[w]] = 1 # 把 i 樣本 t 字符 對應的 OH 編碼位置 寫為 1y[i, word_idx[next_word[i]]] = 15. 使用GRU單元建立RNN模型
- 建模
- 訓練
- 繪制訓練曲線
模型在 100 個 epochs 時已基本上完全擬合了訓練數據
6. 文本生成
- 采樣函數
- 隨機選取訓練文本里的一段開始生成后序文本
輸出:
模型完全記住了后續的詩句。
- 自己隨意編寫訓練集里沒有的詩句作為開始,如下(不可有訓練集中未出現的字)
輸出:
輸出的詩句有部分一整句都是訓練集里的,有的則不是,反正沒有多少詩的美感,哈哈!
總結
以上是生活随笔為你收集整理的使用GRU单元的RNN模型生成唐诗的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1712. 将数组分成
- 下一篇: LeetCode 294. 翻转游戏 I