日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用GRU单元的RNN模型生成唐诗

發布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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 # 文本長度唐詩3001-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)}

輸出:

字和符號數量:2590

3. 創建文本序列

# 根據文本,創建序列 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))) 樣本數量:29365

4. 創建文本編碼序列

# 將文本序列轉化成數字序列(矩陣), 實際上就是一個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]]] = 1

5. 使用GRU單元建立RNN模型

  • 建模
# 建模 from keras.models import Sequential from keras.layers import GRU, Dense from keras.optimizers import Adam model = Sequential() model.add(GRU(units=128,input_shape=(sample_maxlen, len(words)))) # GRU 層 model.add(Dense(units=len(words), activation='softmax')) # FC 層 多分類 softmax
  • 訓練
optimizer = Adam(learning_rate=0.001) # adam 優化器 model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy']) # 配置模型 history = model.fit(X, y, batch_size=128, epochs=500) # 訓練 model.save("tangshi_generator_model.h5") # 保存模型
  • 繪制訓練曲線
import pandas as pd import matplotlib.pyplot as plt pd.DataFrame(history.history).plot(figsize=(8, 5)) # 繪制訓練曲線 plt.grid(True) plt.gca().set_ylim(0, 1) # set the vertical range to [0-1] plt.show()


模型在 100 個 epochs 時已基本上完全擬合了訓練數據

6. 文本生成

  • 采樣函數
def sampling(preds, temperature=1.0):preds = np.asarray(preds).astype('float64')preds = np.log(preds)/temperature # 我的理解是概率平滑exp_preds = np.exp(preds)preds = exp_preds/np.sum(exp_preds)probs = np.random.multinomial(1, preds, 1) # 多項式分布,做n次試驗,按照preds的概率分布(和=1),取出size組結果,如下 # >>> np.random.multinomial(20, [1/6.]*6, size=1) # array([[4, 1, 7, 5, 2, 1]]) # randomreturn np.argmax(probs) # 返回概率最大的idx
  • 隨機選取訓練文本里的一段開始生成后序文本
from keras.models import load_model import random model = load_model("tangshi_generator_model.h5")def generate_tangshi(model, generate_len=200):start_idx = random.randint(0, len(text)-sample_maxlen-1) # 隨機開始位置generated = ""sentence = text[start_idx : start_idx + sample_maxlen] # 開始的句子generated += sentenceprint("隨機選取的開始句子為:{}".format(generated))for i in range(generate_len): # 后續要生成的句子長度x_pred = np.zeros((1, sample_maxlen, len(words)))for t, w in enumerate(sentence):x_pred[0, t, word_idx[w]] = 1 # 當前句子的 OH 編碼preds = model.predict(x_pred)[0] # predict 返回 (1,2590)一個樣本 2590個類預測值next_idx = sampling(preds, 1) # 采樣出來下一個最有可能的詞的idxnext_w = idx_word[next_idx] # 取出這個詞generated += next_w # 加到句子中sentence = sentence[1:] + next_w # 句子窗口后移一個位置,作為下次預測的輸入return generatedgenerate_tangshi(model, 100)

輸出:


模型完全記住了后續的詩句。

  • 自己隨意編寫訓練集里沒有的詩句作為開始,如下(不可有訓練集中未出現的字)


with open('test.txt','r',encoding='utf-8') as f:test_text = f.read()def generate_tangshi_test(model, generate_len=60):generated = ""sentence = test_text[0 : sample_maxlen]generated += sentenceprint("測試文本開始句子為:{}".format(generated))for i in range(generate_len):x_pred = np.zeros((1, sample_maxlen, len(words)))for t, w in enumerate(sentence):x_pred[0, t, word_idx[w]] = 1preds = model.predict(x_pred)[0]next_idx = sampling(preds, 1)next_w = idx_word[next_idx]generated += next_wsentence = sentence[1:] + next_wreturn generatedgenerate_tangshi_test(model, 100)

輸出:

輸出的詩句有部分一整句都是訓練集里的,有的則不是,反正沒有多少詩的美感,哈哈!

總結

以上是生活随笔為你收集整理的使用GRU单元的RNN模型生成唐诗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。