深度學習小課堂:如何利用遞迴神經網路生成文字?

格伯納發表於2018-11-02

作者:Gilbert Tanner

深度學習小課堂:如何利用遞迴神經網路生成文字?


深度學習可用於做許多有趣的事情,但人們通常可能會覺得只有那些最聰明的工程師才能建立這樣的應用程式。但事實並非如此。

通過Keras和其他高階深度學習庫,無論對深度學習理論和內部工作的理解如何,每個人都可以建立和使用深度學習模型。

在這篇文章中,我們將看看如何使用遞迴神經網路以亞瑟·柯南·道爾(Sir Arthur Conan Doyle)的風格,使用他的著作《夏洛克·福爾摩斯的歷險記》作為我們的資料集建立新文字。

我們可以從免費數字圖書館Gutenberg的網站獲取資料。(http://www.gutenberg.org/ebooks/1661?msg=welcome_stranger)

我們只需要將這本書儲存為文字(.txt)檔案,並刪除文字中嵌入的Gutenberg頁首和頁尾。如果你不想自己這樣做,可以從我的Github獲取文字以及本文中涉及的所有程式碼。

https://github.com/TannerGilbert/Keras-Tutorials/tree/master/4.%20LSTM%20Text%20Generation

遞迴神經網路

深度學習小課堂:如何利用遞迴神經網路生成文字?

François Deloche展開的遞迴神經網路(RNN)

遞迴神經網路(RNN)是用於順序資料的現有技術演算法。這是因為他們可以通過內部記憶記住他們以前的輸入。

在本文中,並不會深入探討遞迴神經網路如何工作,但如果你有興趣,可以觀看解釋遞迴神經網路(RNN)的工作原理視訊。

https://programmingwithgilbert.firebaseapp.com/videos/machine-learning-explained/recurrent-neural-networks-lstm-explained

或者可以檢視Niklas Donges的這篇精彩文章。

https://towardsdatascience.com/recurrent-neural-networks-and-lstm-4b601dd822a5

建立資料集

像往常一樣,我們將開始建立資料集。為了使遞迴神經網路(RNN)能夠使用我們提供的文字資料,我們需要將其轉換為數值。然後,我們將建立一個字元序列作為我們的X值,並使用以下字元作為我們的Y值。最後,我們將資料轉換為布林值陣列。

首先,我們將載入資料並建立從字元到整數和整數到字元的對映:

深度學習小課堂:如何利用遞迴神經網路生成文字?


為了獲得我們可用於訓練模型的有價值資料,我們將把資料分成長度為40個字元的子序列。然後我們將資料轉換為布林陣列。

深度學習小課堂:如何利用遞迴神經網路生成文字?


遞迴神經網路模型

儘管建立遞迴神經網路(RNN)聽起來很複雜,但使用Keras實現起來相當容易。我們將建立一個具有以下結構的簡單遞迴神經網路(RNN):

(1)LSTM層:將學習序列

(2)密集(完全連線)層:每個唯一字元的一個輸出神經元

(3)Softmax啟用:將輸出轉換為概率值

我們將使用RMSprop優化器和分類Crossentropy損失函式。https://keras.io/losses/#categorical_crossentropy

深度學習小課堂:如何利用遞迴神經網路生成文字?


輔助函式

為了看到我們的模型在訓練時所做的改進,我們將建立兩個輔助函式。這兩個函式來自Keras團隊的官方LSTM文字生成示例。

https://github.com/keras-team/keras/blob/master/examples/lstm_text_generation.py

第一個輔助函式將從輸出(概率陣列)中取樣索引。它有一個名為temperature(溫度)的引數,它定義了函式在建立文字時的自由度。第二個將在每個週期結束時生成具有四個不同temperature(溫度)的文字,因此我們可以看到我們的模型如何。

深度學習小課堂:如何利用遞迴神經網路生成文字?


深度學習小課堂:如何利用遞迴神經網路生成文字?


我們還將定義另外兩個回撥函式。第一個叫做ModelCheckpoint(模型檢查點)。它會在每個時期儲存我們的模型,減少損失。

深度學習小課堂:如何利用遞迴神經網路生成文字?


另一個回撥將減少每次學習平臺的學習率。

深度學習小課堂:如何利用遞迴神經網路生成文字?


訓練模型並生成新文字

對於訓練,我們需要選擇batch_size和想要訓練的週期數。對於batch_size,選擇128,這只是一個任意數字。只訓練了5個週期的模型,所以不需要等待這麼長時間,但如果你想要,可以訓練更多。

深度學習小課堂:如何利用遞迴神經網路生成文字?


訓練輸出:

深度學習小課堂:如何利用遞迴神經網路生成文字?


深度學習小課堂:如何利用遞迴神經網路生成文字?


為了自己生成文字,我們將建立一個類似於on_epoch_end函式的函式。它將採用隨機起始索引,從文字中取出接下來的40個字元,然後使用它們進行預測。 作為引數,我們將傳遞想要生成的文字的長度以及生成的文字的多樣性。

深度學習小課堂:如何利用遞迴神經網路生成文字?


現在我們可以通過呼叫generate_text函式來建立文字:

深度學習小課堂:如何利用遞迴神經網路生成文字?


生成文字:

深度學習小課堂:如何利用遞迴神經網路生成文字?


結論

遞迴神經網路是一種處理順序資料的技術,因為它們可以通過內部儲存器記住最後的輸入。它們幾乎在每個連續問題上都達到了最先進的效能,並被大多數大公司使用。遞迴神經網路(RNN)可用於生成特定作者風格的文字。

建立文字生成遞迴神經網路(RNN)的步驟如下:

(1)建立或收集資料集

(2)構建遞迴神經網路(RNN)模型

(3)以隨機句子為起點建立新文字

這個專案的細節可以在這裡找到。鼓勵任何人使用程式碼,也許可以更改資料集和預處理步驟,看看會發生什麼。

你可以通過很多方法改進模型以獲得更好的輸出。其中一些是:

(1)使用更復雜的網路結構(更多LSTM和密集層)

(2)訓練更多週期

(3)使用batch_size


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31509949/viewspace-2218481/,如需轉載,請註明出處,否則將追究法律責任。

相關文章