基於LSTM + keras 的詩歌生成器


    最近在github 上發現了一個好玩的項目,一個基於LSTM + keras 實現的詩歌生成器,地址是: https://github.com/youyuge34/Poems_generator_Keras. 我去看了一下代碼,實現的原理其實很common,就是普通的基於LSTM 的序列模型。模型使用了43030首詩進行訓練,最后生成的詩歌還是有模有樣的(當然僅限於有模有樣,自然是不能深究的了)
 
  1. 模型的核心思路:
1 input_tensor = Input(shape=(self.config.max_len, len(self.words)))
2 lstm = LSTM(512, return_sequences=True)(input_tensor)
3 dropout = Dropout(0.6)(lstm)
4 lstm = LSTM(256)(dropout)
5 dropout = Dropout(0.6)(lstm)
6 dense = Dense(len(self.words), activation='softmax')(dropout)
7 self.model = Model(inputs=input_tensor, outputs=dense)
8 optimizer = Adam(lr=self.config.learning_rate)
9 self.model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
keras 真的是極簡的深度學習語言,上述短短的9行代碼就已經包括了全部的模型結構,而且不需要注釋基本都能看懂代碼在做什么。
  • 第一行: 構造輸入向量
  • 第二行,構造了一個LSTM layer, hidden units size = 512
  • 第三行,構造了一個dropout layer,dropout rate = 0.6
  • 第四行,構造了一個LSTM layer,hidden units size = 256
  • 第五行,構造了一個dropout layer,dropout rate = 0.6
  • 第六行,構造了一個全連接層+softmax 作為 output layer
  • 第七行,利用 inputs 和 outputs 構造Model
  • 第八行,使用 Adam 優化器
  • 第九行,compile model,指定了模型的損失函數類型為交叉熵損失,優化器以及評價指標

 

 
 首春:寒隨窮律變,春逐鳥聲開。初風飄帶柳,晚雪間花梅。碧林青舊竹,綠沼翠新苔。芝田初雁去,綺樹巧鶯來。
 初晴落景:晚霞聊自怡,初晴彌可喜。日晃百花色,風動千林翠。池魚躍不同,園鳥聲還異。寄言博通者,知予物外志。
 初夏:一朝春夏改,隔夜鳥花遷。陰陽深淺葉,曉夕重輕煙。哢鶯猶響殿,橫絲正網天。珮高蘭影接,綬細草紋連。碧鱗驚棹側,玄燕舞檐前。何必汾陽處,始復有山泉。
度秋:夏律昨留灰,秋箭今移晷。峨嵋岫初出,洞庭波漸起。桂白發幽岩,菊黃開灞涘。運流方可嘆,含毫屬微理。
  • 冒號前的是詩的名字,冒號后的是詩的內容
 
3. 訓練
  • 我使用的單卡 RTX2080ti(11G顯存) 進行訓練,按照作者的默認配置,一共 訓練了 34000+ epoch,每個 epoch 耗時 1s 左右,總共訓練了接近10個小時。最終得到的keras 可用的模型文件以及訓練日志我放到百度雲了,地址是:https://pan.baidu.com/s/1XV9InTe9vMmwKNs5lBS-tQ
 
4.訓練完成之后,原始的代碼一共提供了4個進行predict 的API:
  • predict_first:給定一個漢字,輸出一首五言絕句
  • predict_random:隨機從全部的訓練詩作當中抽出一首詩的首句,然后生成一首詩
  • predict_gen:給定五個漢字作為首句,生成一首五言絕句
  • predict_hide:給定四個漢字,輸出以這個四個漢字開頭的藏頭詩
  • 為了方便預測,我封裝了一個簡單的 命令行工具,提供了四種預測,代碼可以參考我對原始repo 的 fork 版本(https://github.com/Lyrichu/Poems_generator_Keras/tree/huchengchun),使用方式如下:
 
 
 
 
 
5. 愉快地生成詩歌玩耍吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM