国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

TensorFlow中RNN實現的正確打開方式

人工智能 深度學習
這篇文章提供了一個學習TensorFlow RNN實現的詳細路徑,其中包括了學習順序、可能會踩的坑、源碼分析以及一個示例項目hzy46/Char-RNN-TensorFlow,希望能對大家有所幫助。

[[198810]]

這篇文章的主要內容為如何在TensorFlow中實現RNN的幾種結構:

  • 一個完整的、循序漸進的學習TensorFlow中RNN實現的方法。這個學習路徑的曲線較為平緩,應該可以減少不少學習精力,幫助大家少走彎路。
  • 一些可能會踩的坑
  • TensorFlow源碼分析
  • 一個Char RNN實現示例,可以用來寫詩,生成歌詞,甚至可以用來寫網絡小說!

一、學習單步的RNN:RNNCell

如果要學習TensorFlow中的RNN,***站應該就是去了解“RNNCell”,它是TensorFlow中實現RNN的基本單元,每個RNNCell都有一個call方法,使用方式是:(output, next_state) = call(input, state)。

借助圖片來說可能更容易理解。假設我們有一個初始狀態h0,還有輸入x1,調用call(x1, h0)后就可以得到(output1, h1):

 

再調用一次call(x2, h1)就可以得到(output2, h2):

 

也就是說,每調用一次RNNCell的call方法,就相當于在時間上“推進了一步”,這就是RNNCell的基本功能。

在代碼實現上,RNNCell只是一個抽象類,我們用的時候都是用的它的兩個子類BasicRNNCell和BasicLSTMCell。顧名思義,前者是RNN的基礎類,后者是LSTM的基礎類。這里推薦大家閱讀其源碼實現,一開始并不需要全部看一遍,只需要看下RNNCell、BasicRNNCell、BasicLSTMCell這三個類的注釋部分,應該就可以理解它們的功能了。

除了call方法外,對于RNNCell,還有兩個類屬性比較重要:

  • state_size
  • output_size

前者是隱層的大小,后者是輸出的大小。比如我們通常是將一個batch送入模型計算,設輸入數據的形狀為(batch_size, input_size),那么計算時得到的隱層狀態就是(batch_size, state_size),輸出就是(batch_size, output_size)。

可以用下面的代碼驗證一下(注意,以下代碼都基于TensorFlow***的1.2版本):

  1. import tensorflow as tf 
  2. import numpy as np 
  3.  
  4. cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) # state_size = 128 
  5. print(cell.state_size) # 128 
  6.  
  7. inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size 
  8. h0 = cell.zero_state(32, np.float32) # 通過zero_state得到一個全0的初始狀態,形狀為(batch_size, state_size) 
  9. output, h1 = cell.call(inputs, h0) #調用call函數 
  10.  
  11. print(h1.shape) # (32, 128)  

對于BasicLSTMCell,情況有些許不同,因為LSTM可以看做有兩個隱狀態h和c,對應的隱層就是一個Tuple,每個都是(batch_size, state_size)的形狀:

  1. import tensorflow as tf 
  2. import numpy as np 
  3. lstm_cell = tf.nn.rnn_cell.BasicLSTMCell(num_units=128) 
  4. inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size 
  5. h0 = lstm_cell.zero_state(32, np.float32) # 通過zero_state得到一個全0的初始狀態 
  6. output, h1 = lstm_cell.call(inputs, h0) 
  7.  
  8. print(h1.h)  # shape=(32, 128) 
  9. print(h1.c)  # shape=(32, 128)  

二、學習如何一次執行多步:tf.nn.dynamic_rnn

基礎的RNNCell有一個很明顯的問題:對于單個的RNNCell,我們使用它的call函數進行運算時,只是在序列時間上前進了一步。比如使用x1、h0得到h1,通過x2、h1得到h2等。這樣的h話,如果我們的序列長度為10,就要調用10次call函數,比較麻煩。對此,TensorFlow提供了一個tf.nn.dynamic_rnn函數,使用該函數就相當于調用了n次call函數。即通過{h0,x1, x2, …., xn}直接得{h1,h2…,hn}。

具體來說,設我們輸入數據的格式為(batch_size, time_steps, input_size),其中time_steps表示序列本身的長度,如在Char RNN中,長度為10的句子對應的time_steps就等于10。***的input_size就表示輸入數據單個序列單個時間維度上固有的長度。另外我們已經定義好了一個RNNCell,調用該RNNCell的call函數time_steps次,對應的代碼就是:

  1. # inputs: shape = (batch_size, time_steps, input_size)  
  2. # cell: RNNCell 
  3. # initial_state: shape = (batch_size, cell.state_size)。初始狀態。一般可以取零矩陣 
  4. outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)  

此時,得到的outputs就是time_steps步里所有的輸出。它的形狀為(batch_size, time_steps, cell.output_size)。state是***一步的隱狀態,它的形狀為(batch_size, cell.state_size)。

此處建議大家閱讀tf.nn.dynamic_rnn的文檔做進一步了解。

三、學習如何堆疊RNNCell:MultiRNNCell

很多時候,單層RNN的能力有限,我們需要多層的RNN。將x輸入***層RNN的后得到隱層狀態h,這個隱層狀態就相當于第二層RNN的輸入,第二層RNN的隱層狀態又相當于第三層RNN的輸入,以此類推。在TensorFlow中,可以使用tf.nn.rnn_cell.MultiRNNCell函數對RNNCell進行堆疊,相應的示例程序如下:

  1. import tensorflow as tf 
  2. import numpy as np 
  3.  
  4. # 每調用一次這個函數就返回一個BasicRNNCell 
  5. def get_a_cell(): 
  6.     return tf.nn.rnn_cell.BasicRNNCell(num_units=128) 
  7. # 用tf.nn.rnn_cell MultiRNNCell創建3層RNN 
  8. cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3層RNN 
  9. # 得到的cell實際也是RNNCell的子類 
  10. # 它的state_size是(128, 128, 128) 
  11. # (128, 128, 128)并不是128x128x128的意思 
  12. # 而是表示共有3個隱層狀態,每個隱層狀態的大小為128 
  13. print(cell.state_size) # (128, 128, 128) 
  14. # 使用對應的call函數 
  15. inputs = tf.placeholder(np.float32, shape=(32, 100)) # 32 是 batch_size 
  16. h0 = cell.zero_state(32, np.float32) # 通過zero_state得到一個全0的初始狀態 
  17. output, h1 = cell.call(inputs, h0) 
  18. print(h1) # tuple中含有3個32x128的向量  

通過MultiRNNCell得到的cell并不是什么新鮮事物,它實際也是RNNCell的子類,因此也有call方法、state_size和output_size屬性。同樣可以通過tf.nn.dynamic_rnn來一次運行多步。

此處建議閱讀MutiRNNCell源碼中的注釋進一步了解其功能。

四、可能遇到的坑1:Output說明

在經典RNN結構中有這樣的圖:

 

在上面的代碼中,我們好像有意忽略了調用call或dynamic_rnn函數后得到的output的介紹。將上圖與TensorFlow的BasicRNNCell對照來看。h就對應了BasicRNNCell的state_size。那么,y是不是就對應了BasicRNNCell的output_size呢?答案是否定的。

找到源碼中BasicRNNCell的call函數實現:

  1. def call(self, inputs, state): 
  2.     """Most basic RNN: output = new_state = act(W * input + U * state + B).""" 
  3.     output = self._activation(_linear([inputs, state], self._num_units, True)) 
  4.     return outputoutput  

這句“return output, output”說明在BasicRNNCell中,output其實和隱狀態的值是一樣的。因此,我們還需要額外對輸出定義新的變換,才能得到圖中真正的輸出y。由于output和隱狀態是一回事,所以在BasicRNNCell中,state_size永遠等于output_size。TensorFlow是出于盡量精簡的目的來定義BasicRNNCell的,所以省略了輸出參數,我們這里一定要弄清楚它和圖中原始RNN定義的聯系與區別。

再來看一下BasicLSTMCell的call函數定義(函數的***幾行):

  1. new_c = ( 
  2.     c * sigmoid(f + self._forget_bias) + sigmoid(i) * self._activation(j)) 
  3. new_h = self._activation(new_c) * sigmoid(o) 
  4.  
  5. if self._state_is_tuple: 
  6.   new_state = LSTMStateTuple(new_c, new_h) 
  7. else
  8.   new_state = array_ops.concat([new_c, new_h], 1) 
  9. return new_h, new_state  

我們只需要關注self._state_is_tuple == True的情況,因為self._state_is_tuple == False的情況將在未來被棄用。返回的隱狀態是new_c和new_h的組合,而output就是單獨的new_h。如果我們處理的是分類問題,那么我們還需要對new_h添加單獨的Softmax層才能得到***的分類概率輸出。

還是建議大家親自看一下源碼實現來搞明白其中的細節。

五、可能遇到的坑2:因版本原因引起的錯誤

在前面我們講到堆疊RNN時,使用的代碼是:

  1. # 每調用一次這個函數就返回一個BasicRNNCell 
  2. def get_a_cell(): 
  3.     return tf.nn.rnn_cell.BasicRNNCell(num_units=128) 
  4. # 用tf.nn.rnn_cell MultiRNNCell創建3層RNN 
  5. cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3層RNN  

這個代碼在TensorFlow 1.2中是可以正確使用的。但在之前的版本中(以及網上很多相關教程),實現方式是這樣的:

  1. one_cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) 
  2.  
  3. cell = tf.nn.rnn_cell.MultiRNNCell([one_cell] * 3) # 3層RNN  

如果在TensorFlow 1.2中還按照原來的方式定義,就會引起錯誤!

六、一個練手項目:Char RNN

上面的內容實際上就是TensorFlow中實現RNN的基本知識了。這個時候,建議大家用一個項目來練習鞏固一下。此處特別推薦Char RNN項目,這個項目對應的是經典的RNN結構,實現它使用的TensorFlow函數就是上面說到的幾個,項目本身又比較有趣,可以用來做文本生成,平常大家看到的用深度學習來寫詩寫歌詞的基本用的就是它了。

Char RNN的實現已經有很多了,可以自己去Github上面找,我這里也做了一個實現,供大家參考。項目地址為:hzy46/Char-RNN-TensorFlow

我主要向代碼中添加了embedding層,以支持中文,另外重新整理了代碼結構,將API改成了***的TensorFlow 1.2版本。

可以用這個項目來寫詩(以下詩句都是自動生成的):

何人無不見,此地自何如。

一夜山邊去,江山一夜歸。

山風春草色,秋水夜聲深。

何事同相見,應知舊子人。

何當不相見,何處見江邊。

一葉生云里,春風出竹堂。

何時有相訪,不得在君心。

還可以生成代碼:

  1. static int page_cpus(struct flags *str) 
  2.         int rc; 
  3.         struct rq *do_init; 
  4. }; 
  5.  
  6. /* 
  7.  * Core_trace_periods the time in is is that supsed, 
  8.  */ 
  9. #endif 
  10.  
  11. /* 
  12.  * Intendifint to state anded. 
  13.  */ 
  14. int print_init(struct priority *rt) 
  15. {       /* Comment sighind if see task so and the sections */ 
  16.         console(string, &can); 
  17.  

此外生成英文更不是問題(使用莎士比亞的文本訓練):

LAUNCE:

The formity so mistalied on his, thou hast she was

to her hears, what we shall be that say a soun man

Would the lord and all a fouls and too, the say,

That we destent and here with my peace.

PALINA:

Why, are the must thou art breath or thy saming,

I have sate it him with too to have me of

I the camples.

***,如果你腦洞夠大,還可以來做一些更有意思的事情,比如我用了著名的網絡小說《斗破蒼穹》訓練了一個RNN模型,可以生成下面的文本:

聞言,蕭炎一怔,旋即目光轉向一旁的那名灰袍青年,然后目光在那位老者身上掃過,那里,一個巨大的石臺上,有著一個巨大的巨坑,一些黑色光柱,正在從中,一道巨大的黑色巨蟒,一股極度恐怖的氣息,從天空上暴射而出 ,然后在其中一些一道道目光中,閃電般的出現在了那些人影,在那種靈魂之中,卻是有著許些強者的感覺,在他們面前,那一道道身影,卻是如同一道黑影一般,在那一道道目光中,在這片天地間,在那巨大的空間中,彌漫而開……

“這是一位斗尊階別,不過不管你,也不可能會出手,那些家伙,可以為了這里,這里也是能夠有著一些異常,而且他,也是不能將其他人給你的靈魂,所以,這些事,我也是不可能將這一個人的強者給吞天蟒,這般一次,我們的實力,便是能夠將之擊殺……”

“這里的人,也是能夠與魂殿強者抗衡。”

蕭炎眼眸中也是掠過一抹驚駭,旋即一笑,旋即一聲冷喝,身后那些魂殿殿主便是對于蕭炎,一道冷喝的身體,在天空之上暴射而出,一股恐怖的勁氣,便是從天空傾灑而下。

“嗤!”

還是挺好玩的吧,另外還嘗試了生成日文等等。

七、學習完整版的LSTMCell

上面只說了基礎版的BasicRNNCell和BasicLSTMCell。TensorFlow中還有一個“完全體”的LSTM:LSTMCell。這個完整版的LSTM可以定義peephole,添加輸出的投影層,以及給LSTM的遺忘單元設置bias等,可以參考其源碼了解使用方法。

八、學習***的Seq2Seq API

Google在TensorFlow的1.2版本(1.3.0的rc版已經出了,貌似正式版也要出了,更新真是快)中更新了Seq2Seq API,使用這個API我們可以不用手動地去定義Seq2Seq模型中的Encoder和Decoder。此外它還和1.2版本中的新數據讀入方式Datasets兼容。可以閱讀此處的文檔學習它的使用方法。

九、總結

***簡單地總結一下,這篇文章提供了一個學習TensorFlow RNN實現的詳細路徑,其中包括了學習順序、可能會踩的坑、源碼分析以及一個示例項目hzy46/Char-RNN-TensorFlow,希望能對大家有所幫助。 

責任編輯:龐桂玉 來源: 36大數據
相關推薦

2022-03-22 07:37:04

FeignSpringRibbon

2016-03-01 14:51:18

云計算DevOps

2016-01-08 11:00:14

OpenStack云計算

2019-02-20 14:35:57

區塊鏈數字貨幣比特幣

2023-07-10 09:38:06

兼容性測試方案

2021-11-25 07:43:56

CIOIT董事會

2025-04-30 08:20:58

2021-11-10 16:03:42

Pyecharts Python可視化

2021-10-09 15:49:00

5G網絡技術

2018-10-29 15:20:03

2020-07-05 09:17:20

云桌面

2021-06-07 10:05:56

性能優化Kafka

2020-06-04 15:16:46

云計算

2022-06-22 09:06:54

CSS垂直居中代碼

2025-09-09 08:47:58

2019-03-17 16:48:51

物聯網云計算數據信息

2021-01-11 10:47:09

IT部門網絡管理

2022-08-16 08:33:06

DevOps實踐

2018-07-03 09:41:23

數據庫系統 計算機

2021-06-15 11:44:01

芯片
點贊
收藏

51CTO技術棧公眾號

三级短视频在线| 久久婷婷麻豆| 精品在线网站观看| 国产在线乱码一区二区三区| 中日韩午夜理伦电影免费 | 小说区图片区图片区另类灬| 婷婷另类小说| 欧美一级视频一区二区| 久久69av| 日韩在线www| 97久久网站| 色系列之999| 日本免费成人| 亚洲日本中文字幕| 少妇高清精品毛片在线视频| 中文有码一区| 国产精品wwwwww| 欧美aa在线观看| 99国产精品久久久久久久久久| 国产精品美女主播| 1区2区3区在线| 国产剧情av麻豆香蕉精品| 国产精品人成电影| 国产资源在线观看入口av| 亚洲精品在线观| 福利视频在线| 亚洲第一区第二区| 色香欲www7777综合网| av小次郎在线| 深夜成人在线| 一级精品视频在线观看宜春院 | 91色在线看| 国产精品亚洲精品| 中文在线综合| 久久久久久久久久国产精品| 日韩在线网址| 欧美一级淫片丝袜脚交| 日韩理论片av| 国产一区二区三区黄| 国产一区二区你懂的| 夜夜爽99久久国产综合精品女不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 中文字幕第21页| 国产精品美女www爽爽爽| 不卡影院一区二区| 麻豆乱码国产一区二区三区| 成人黄色免费短视频| 三级精品视频久久久久| 一区二区三区视频播放| 国产999精品久久久| 国产精品www994| 午夜精品一区二区在线观看的| 国产成人啪免费观看软件| 欧美高清hd| 欧美黑人3p| 国产一区二区精品| 影音先锋欧美在线| wwwwxxxxx欧美| 毛片毛片毛片毛片| 欧美性猛交一区二区三区精品| 中文在线观看免费| 在线播放国产精品| 精品美女久久| 免费在线国产精品| 99久久免费精品高清特色大片| 自拍偷拍精选| 在线影视一区二区三区| 澳门av一区二区三区| 欧美做受高潮电影o| 久久国产毛片| 性生活免费在线观看| 7777精品久久久大香线蕉| 成人在线日韩| 国产精品久久国产三级国电话系列 | 亚洲精品免费看| 2020av在线| 成人免费视频视频在线观看免费| 精品国产一区二区三区小蝌蚪| 国语自产偷拍精品视频偷 | 蜜乳av综合| 中中文字幕av在线| 国严精品久久久久久亚洲影视| 亚洲免费观看高清完整版在线| 精品一区三区| 男人天堂999| 欧美男女性生活在线直播观看| 美女视频第一区二区三区免费观看网站| 裤袜国产欧美精品一区| 免费网站在线观看视频| 91精品久久久久久久久久不卡| 日本在线视频www色| 午夜精品aaa| 天堂va在线高清一区| 国产乱码精品一区二区三区忘忧草| 欧美亚洲精品在线| xx欧美撒尿嘘撒尿xx| 不卡中文字幕av| 亚洲一二三四区| 综合天堂av久久久久久久| 麻豆传媒在线观看| 99r国产精品视频| 久久综合伊人77777尤物| 在线看国产精品| 欧美日韩一区成人| 久久九九99视频| 久久成人av少妇免费| 国产不卡精品在线| 麻豆视频在线免费观看| 激情亚洲综合网| 亚洲精品在线电影| 精品亚洲一区二区三区| 亚洲一区二区不卡免费| 国产精品视频在线播放| 99精品桃花视频在线观看| 97caopron在线视频| 成人午夜在线观看| 中文字幕在线一区| 日本综合精品一区| 黄色一级视频片| 亚洲色图35p| 精品一区二区三区蜜桃| 日本大片在线播放| 欧美日韩一区二区视频在线| 欧美蜜桃一区二区三区 | 亚洲成人激情av| 妖精一区二区三区精品视频| 精品视频在线观看一区| 在线播放国产一区二区三区| 久久99国产精品麻豆| av中文字幕在线看| 成年人免费观看的视频| 亚洲国产高清高潮精品美女| 免费看欧美女人艹b| 日韩伦理在线| 女人床在线观看| www.亚洲人.com| 国产欧美一区二区三区网站 | 丰满少妇在线观看| 久久男人av资源网站| 亚洲美女淫视频| 外国成人免费视频| 午夜伦理在线| 日韩女优中文字幕| 亚洲午夜小视频| 久久精品视频免费观看| 天天躁日日躁狠狠躁欧美| 伊人永久在线| 久久久久网址| 亚洲欧美日韩天堂一区二区| 成人国产视频在线观看| 97久久视频| 91成人免费在线| 91超碰成人| 91欧美在线视频| 欧美在线激情| 亚洲成人免费网站| 国产成人综合网站| 日韩区一区二| 亚洲永久精品免费| 国产精品免费一区二区三区四区 | 在线免费观看一区二区三区| 亚洲全黄一级网站| 久久精品人人做人人综合 | 亚洲大胆av| 麻豆蜜桃在线观看| 中文字幕无码不卡免费视频| 日本一区二区在线播放| 最新欧美电影| 无码人妻丰满熟妇区毛片18| 国产精品成人免费电影| 欧美久久久久久蜜桃| 成人免费看黄yyy456| 中文字幕精品影院| 免费观看成人高潮| 国产av麻豆mag剧集| 国产精品欧美一区二区三区奶水| 欧美三片在线视频观看| 激情欧美一区二区三区在线观看| 精品国产一区二区三区成人影院| jizz在线观看视频| 啊啊啊一区二区| 不卡日韩av| 久久韩剧网电视剧| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲男同性恋视频| 免费一区视频| 极品束缚调教一区二区网站| 免费av在线网站| 波多野结衣家庭教师视频| 国产精品推荐精品| 蜜臀久久99精品久久久久久宅男| 日本久久电影网| 久久精品一区二区三区不卡| 亚洲日韩视频| 国产伦理久久久久久妇女| 亚洲影院在线观看| 欧美黄色免费| 中文欧美在线视频| 国产精品传媒视频| 日日夜夜精品免费视频|