TensorFlow系列專題(八):七步帶你實現RNN循環神經網絡小示例

編輯 | 安可

出品 | 磐創AI技術團隊

【前言】:在前面的內容裏,我們已經學習了循環神經網絡的基本結構和運算過程,這一小節裏,我們將用TensorFlow實現簡單的RNN,並且用來解決時序數據的預測問題,看一看RNN究竟能達到什麼樣的效果,具體又是如何實現的。

在這個演示項目裏,我們使用隨機生成的方式生成一個數據集(由0和1組成的二進制序列),然後人爲的增加一些數據間的關係。最後我們把這個數據集放進RNN裏,讓RNN去學習其中的關係,實現二進制序列的預測1。數據生成的方式如下:

循環生成規模爲五十萬的數據集,每次產生的數據爲0或1的概率均爲0.5。如果連續生成了兩個1(或兩個0)的話,則下一個數據強制爲0(或1)。

1. 我們首先導入需要的Python模塊:

2. 定義一個Data類,用來產生數據:

3. 在構造方法“__init__”中,我們初始化了數據集的大小“data_size”、一個batch的大小“batch_size”、一個epoch中的batch數目“num_batch”以及RNN的時間步“time_step”。接下來我們定義一個“generate_data”方法:

在第11行代碼中,我們用了“np.random.choice”函數生成的由0和1組成的長串數據。接下來我們用了一個for循環,在“data_without_rel”保存的數據的基礎上重新生成了一組數據,並保存在“data_with_rel”數組中。爲了使生成的數據間具有一定的序列關係,我們使用了前面介紹的很簡單的數據生成方式:以“data_without_rel”中的數據爲參照,如果出現了連續兩個1(或0)則生成一個0(或1),其它情況則以相等概率隨機生成0或1。

有了數據我們接下來要用RNN去學習這些數據,看看它能不能學習到我們產生這些數據時使用的策略,即數據間的聯繫。評判RNN是否學習到規律以及學習的效果如何的依據,是我們在第三章裏介紹過的交叉熵損失函數。根據我們生成數據的規則,如果RNN沒有學習到規則,那麼它預測正確的概率就是0.5,否則它預測正確的概率爲:0.5*0.5+0.5*1=0.75(在“data_without_rel”中,連續出現的兩個數字的組合爲:00、01、10和11。00和11出現的總概率佔0.5,在這種情況下,如果RNN學習到了規律,那麼一定能預測出下一個數字,00對應1,11對應0。而如果出現的是01或10的話,RNN預測正確的概率就只有0.5,所以綜合起來就是0.75)。

根據交叉熵損失函數,在沒有學習到規律的時候,其交叉熵損失爲:

loss = - (0.5 * np.log(0.5) + 0.5 * np.log(0.5)) = 0.6931471805599453

在學習到規律的時候,其交叉熵損失爲:

Loss = -0.5*(0.5 * np.log(0.5) + np.log(0.5))

=-0.25 * (1 * np.log(1) ) - 0.25 * (1 *np.log(1))

=0.34657359027997264

4. 我們定義“generate_epochs”方法處理生成的數據:

5. 接下來實現RNN部分:

6. 定義RNN模型:

這裏我們使用了“dynamic_rnn”,因此每次會同時處理所有batch的第一組數據,總共處理的次數爲:batch_size / time_step。

7. 到這裏,我們已經實現了整個RNN模型,接下來初始化相關數據,看看RNN的學習效果如何:

定義數據集的大小爲500000,每個batch的大小爲2000,RNN的“時間步”設爲5,隱藏層的神經元數目爲6。將訓練過程中的loss可視化,結果如下圖中的左側圖像所示:

圖1 二進制序列數據訓練的loss曲線

從左側loss曲線可以看到,loss最終穩定在了0.35左右,這與我們之前的計算結果一致,說明RNN學習到了序列數據中的規則。右側的loss曲線是在調整了序列關係的時間間隔後(此時的time_step過小,導致RNN無法學習到序列數據的規則)的結果,此時loss穩定在0.69左右,與之前的計算也吻合。

下一篇,我們將介紹幾種常見的RNN循環神經網絡結構以及部分代碼示例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章