最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

變長雙向rnn的正確使用姿勢教學(xué)

 更新時間:2021年05月31日 17:07:51   作者:代碼醫(yī)生  
這篇文章主要介紹了變長雙向rnn的正確使用姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

如何使用雙向RNN

在《深度學(xué)習(xí)之TensorFlow入門、原理與進階實戰(zhàn)》一書的9.4.2中的第4小節(jié)中,介紹過變長動態(tài)RNN的實現(xiàn)。

這里在來延伸的講解一下雙向動態(tài)rnn在處理變長序列時的應(yīng)用。其實雙向RNN的使用中,有一個隱含的注意事項,非常容易犯錯。

本文就在介紹下雙向RNN的常用函數(shù)、用法及注意事項。

動態(tài)雙向rnn有兩個函數(shù):

stack_bidirectional_dynamic_rnn
bidirectional_dynamic_rnn

二者的實現(xiàn)上大同小異,放置的位置也不一樣,前者放在contrib下面,而后者顯得更加根紅苗正,放在了tf的核心庫下面。在使用時二者的返回值也有所區(qū)別。下面就來一一介紹。

示例代碼

先以GRU的cell代碼為例:

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
# 創(chuàng)建輸入數(shù)據(jù)
X = np.random.randn(2, 4, 5)# 批次 、序列長度、樣本維度
# 第二個樣本長度為3
X[1,2:] = 0
seq_lengths = [4, 2]
Gstacked_rnn = []
Gstacked_bw_rnn = []
for i in range(3):
    Gstacked_rnn.append(tf.contrib.rnn.GRUCell(3))
    Gstacked_bw_rnn.append(tf.contrib.rnn.GRUCell(3))
#建立前向和后向的三層RNN
Gmcell = tf.contrib.rnn.MultiRNNCell(Gstacked_rnn)
Gmcell_bw = tf.contrib.rnn.MultiRNNCell(Gstacked_bw_rnn)
sGbioutputs, sGoutput_state_fw, sGoutput_state_bw = tf.contrib.rnn.stack_bidirectional_dynamic_rnn([Gmcell],[Gmcell_bw], X,sequence_length=seq_lengths,                                           dtype=tf.float64)
Gbioutputs, Goutput_state_fw = tf.nn.bidirectional_dynamic_rnn(Gmcell,Gmcell_bw, X,sequence_length=seq_lengths,dtype=tf.float64)

上面例子中是創(chuàng)建雙向RNN的方法示例??梢钥吹綆в衧tack的雙向RNN會輸出3個返回值,而不帶有stack的雙向RNN會輸出2個返回值。

這里面還要注意的是,在沒有未cell初始化時必須要將dtype參數(shù)賦值。不然會報錯。

代碼:BiRNN輸出

下面添加代碼,將輸出的值打印出來,看一下,這兩個函數(shù)到底是輸出的是啥?

#建立一個會話
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
sgbresult,sgstate_fw,sgstate_bw=sess.run([sGbioutputs,sGoutput_state_fw,sGoutput_state_bw])
print("全序列:\n", sgbresult[0])
print("短序列:\n", sgbresult[1])
print('Gru的狀態(tài):',len(sgstate_fw[0]),'\n',sgstate_fw[0][0],'\n',sgstate_fw[0][1],'\n',sgstate_fw[0][2])
print('Gru的狀態(tài):',len(sgstate_bw[0]),'\n',sgstate_bw[0][0],'\n',sgstate_bw[0][1],'\n',sgstate_bw[0][2])

先看一下帶有stack的雙向RNN輸出的內(nèi)容:

這里寫圖片描述

我們輸入的數(shù)據(jù)的批次是2,第一個序列長度是4,第二個序列長度是2.

圖中共有4部分輸出,可以看到,第一部分(全序列)就是序列長度為4的結(jié)果,第二部分(短序列)就是序列長度為2的結(jié)果。由于沒一層都是由3個RNN的GRU cell組成,所以每個序列的輸出都為3.很顯然,對于這樣的結(jié)果輸出,必須要將短序列后面的0去掉才可以用。

好在該函數(shù)還有第二個輸出值,GRU的狀態(tài)??梢灾苯邮褂脿顟B(tài)里的值,而不需要對原始結(jié)果進行去0的變化。

由于單個GRU本來就是沒有狀態(tài)的。所以該函數(shù)將最后的輸出作為狀態(tài)返回。該函數(shù)有兩個狀態(tài)返回,分別代表前向和后向。每一個方向的狀態(tài)都會返回3個元素。這是因為每個方向的網(wǎng)絡(luò)都有3層GRU組成。在使用時,一般都會取最后一個狀態(tài)。圖中紅色部分為前向中,兩個樣本對應(yīng)的輸出,這個很好理解。

重點要看藍色的部分,即反向的狀態(tài)值對應(yīng)的是原始數(shù)據(jù)中最其實的序列輸入。因為是反向RNN,在反向循環(huán)時,是會把序列中最后的放在最前面,所以反向網(wǎng)絡(luò)的生成結(jié)果就會與最開始的序列相對應(yīng)。

對于特征提取任務(wù)處理時,正向與反向的最后值都為該序列的特征,需要合并起來統(tǒng)一處理。但是對于下一個序列預(yù)測任務(wù)時,建議直接使用正向的RNN網(wǎng)絡(luò)就可以了。

如果要獲取雙向RNN的結(jié)果,尤其是變長情況下,通過狀態(tài)拿到值直接拼接起來才是正確的做法。即便不是變長。直接使用輸出值來拼接,會損失掉反向的一部分特征結(jié)果。這是需要值得注意的地方。

代碼:BiRNN輸出

好了。在接著看下不帶stack的函數(shù)輸出是什么樣子的

gbresult,state_fw=sess.run([Gbioutputs,Goutput_state_fw])
print("正向:\n", gbresult[0])
print("反向:\n", gbresult[1])
print('狀態(tài):',len(state_fw),'\n',state_fw[0],'\n',state_fw[1])  #state_fw[0]:【層,批次,cell個數(shù)】 重頭到最后一個序列
print(state_fw[0][-1],state_fw[1][-1])
out  = np.concatenate((state_fw[0][-1],state_fw[1][-1]),axis = 1)
print("拼接",out)

這次,在輸出基本內(nèi)容基礎(chǔ)上,直接將結(jié)果拼接起來。上面代碼運行后會輸出如下內(nèi)容。

這里寫圖片描述

同樣正向用紅色,反向用藍色。改函數(shù)返回的輸出值,沒有將正反向拼接。輸出的狀態(tài)雖然是一個值,但是里面有兩個元素,一個代表正向狀態(tài),一個代表反向狀態(tài).

從輸出中可以看到,最后一行實現(xiàn)了最終結(jié)果的真正拼接。在使用雙向rnn時可以按照上面的例子代碼將其狀態(tài)拼接成一條完整輸出,然后在進行處理。

代碼:LSTM的雙向RNN

類似的如果想使用LSTM cell。將前面的GRU部分替換即可,代碼如下:

stacked_rnn = []
stacked_bw_rnn = []
for i in range(3):
    stacked_rnn.append(tf.contrib.rnn.LSTMCell(3))
    stacked_bw_rnn.append(tf.contrib.rnn.LSTMCell(3))
mcell = tf.contrib.rnn.MultiRNNCell(stacked_rnn)
mcell_bw = tf.contrib.rnn.MultiRNNCell(stacked_bw_rnn)    
bioutputs, output_state_fw, output_state_bw = tf.contrib.rnn.stack_bidirectional_dynamic_rnn([mcell],[mcell_bw], X,sequence_length=seq_lengths,
                                              dtype=tf.float64)
bioutputs, output_state_fw = tf.nn.bidirectional_dynamic_rnn(mcell,mcell_bw, X,sequence_length=seq_lengths,
                                              dtype=tf.float64)

至于輸出的內(nèi)容是什么,可以按照前面GRU的輸出部分顯示出來自己觀察。如何拼接,也可以參照GRU的例子來做。

通過將正反向的狀態(tài)拼接起來才可以獲得雙向RNN的最終輸出特征。千萬不要直接拿著輸出不加處理的來進行后續(xù)的運算,這會損失一大部分的運算特征。

該部分內(nèi)容屬于《深度學(xué)習(xí)之TensorFlow入門、原理與進階實戰(zhàn)》一書的內(nèi)容補充。關(guān)于RNN的更多介紹可以參看書中第九章的詳細內(nèi)容。

我對雙向RNN 的理解

1、雙向RNN使用的場景:有些情況下,當前的輸出不只依賴于之前的序列元素,還可能依賴之后的序列元素; 比如做完形填空,機器翻譯等應(yīng)用。

2、Tensorflow 中實現(xiàn)雙向RNN 的API是:bidirectional_dynamic_rnn; 其本質(zhì)主要是做了兩次reverse:

第一次reverse:將輸入序列進行reverse,然后送入dynamic_rnn做一次運算.

第二次reverse:將上面dynamic_rnn返回的outputs進行reverse,保證正向和反向輸出的time是對上的.

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中的np.random.seed()隨機數(shù)種子問題及解決方法

    Python中的np.random.seed()隨機數(shù)種子問題及解決方法

    隨機數(shù)種子,相當于我給接下來需要生成的隨機數(shù)一個初值,按照我給的這個初值,按固定順序生成隨機數(shù),接下來通過本文給大家介紹Python中的np.random.seed()隨機數(shù)種子問題,需要的朋友可以參考下
    2022-04-04
  • python爬取氣象臺每日天氣圖代碼

    python爬取氣象臺每日天氣圖代碼

    大家好,本篇文章主要講的是python爬取氣象臺每日天氣圖代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 利用python將圖片版PDF轉(zhuǎn)文字版PDF

    利用python將圖片版PDF轉(zhuǎn)文字版PDF

    今天為大家介紹一下如何使用利用python將圖片版PDF轉(zhuǎn)文字版PDF,這里我們需要用到python3.6,pypdf2,ghostscript,PythonMagick,百度文字識別服務(wù)和pdfkit
    2019-05-05
  • Python的pytest測試框架中fixture的使用詳解

    Python的pytest測試框架中fixture的使用詳解

    這篇文章主要介紹了pytest中fixture的使用詳解,pytest是一個非常成熟的全功能的Python測試框架,能夠支持簡單的單元測試和復(fù)雜的功能測試,還可以用來做selenium/appnium等自動化測試、接口自動化測試,需要的朋友可以參考下
    2023-07-07
  • 利用Python通過商品條形碼查詢商品信息的實現(xiàn)示例

    利用Python通過商品條形碼查詢商品信息的實現(xiàn)示例

    這篇文章主要介紹了利用Python通過商品條形碼查詢商品信息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Python中關(guān)于文件的具體操作與介紹

    Python中關(guān)于文件的具體操作與介紹

    文件與目錄操作是編程語言中非常重要的功能,Python也對其提供了相應(yīng)的API支持,這篇博文就是具體介紹它們的使用方法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • pytorch中的nn.ZeroPad2d()零填充函數(shù)實例詳解

    pytorch中的nn.ZeroPad2d()零填充函數(shù)實例詳解

    這篇文章主要介紹了pytorch中的nn.ZeroPad2d()零填充函數(shù)實例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 使用Python實現(xiàn)屏幕截圖的兩種方法

    使用Python實現(xiàn)屏幕截圖的兩種方法

    Python作為一種高效的編程語言,可以通過一些庫來實現(xiàn)對屏幕的截圖操作,本文主要介紹了使用Python實現(xiàn)屏幕截圖的兩種方法,具有一定的 參考價值,感興趣的可以了解一下
    2023-12-12
  • 如何使用python記錄室友的抖音在線時間

    如何使用python記錄室友的抖音在線時間

    這篇文章主要介紹了如何使用python記錄室友的抖音在線時間,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 利用setuptools打包python程序的方法步驟

    利用setuptools打包python程序的方法步驟

    這篇文章主要介紹了利用setuptools打包python程序的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評論

台南市| 开远市| 邛崃市| 犍为县| 竹山县| 平谷区| 临洮县| 苏州市| 滕州市| 工布江达县| 龙胜| 扎兰屯市| 柞水县| 丘北县| 五华县| 晋江市| 巴青县| 临潭县| 高清| 琼结县| 沈丘县| 睢宁县| 东乌珠穆沁旗| 莲花县| 泗洪县| 丰原市| 九寨沟县| 青河县| 吉隆县| 烟台市| 磴口县| 临漳县| 商洛市| 河池市| 重庆市| 西平县| 中阳县| 华坪县| 永寿县| 东辽县| 韶关市|