TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

磐創AI發表於2018-11-22

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

編輯 | 安可

出品 | 磐創AI技術團隊

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

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

迴圈生成規模為五十萬的資料集,每次產生的資料為0或1的概率均為0.5。如果連續生成了兩個1(或兩個0)的話,則下一個資料強制為0(或1)。

1. 我們首先匯入需要的Python模組:

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例 

2. 定義一個Data類,用來產生資料:

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例 

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

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

在第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”方法處理生成的資料:

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

5. 接下來實現RNN部分:

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

6. 定義RNN模型:

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

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

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例 

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

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

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

TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例TensorFlow系列專題(八):七步帶你實現RNN迴圈神經網路小示例

圖1 二進位制序列資料訓練的loss曲線

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

原文連結:https://mp.weixin.qq.com/s/ol91meefAd9j3G0EAVtN3w

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

相關文章