cba瀹屾暣璧涚▼ :雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解

cba广东队赛程 www.axwwg.com  更新時間:2020-01-26 11:00:53   作者:佚名   我要評論(0)

雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解
先說下為什么要使用到雙向RNN,在讀一篇文章的時候,上文提到的信息十分的重要,但這些信息是不足以捕捉文章信

雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解

先說下為什么要使用到雙向RNN,在讀一篇文章的時候,上文提到的信息十分的重要,但這些信息是不足以捕捉文章信息的,下文隱含的信息同樣會對該時刻的語義產生影響。

舉一個不太恰當的例子,某次工作會議上,領導進行“簡潔地”總結,他會在第一句告訴你:“下面,為了節約時間,我簡單地說兩點…”,(…此處略去五百字…),“首先,….”,(…此處略去一萬字…),“礙于時間的關系,我要加快速度了,下面我簡要說下第二點…”(…此處再次略去五千字…)“好的,我想說的大概就是這些”(…此處又略去了二百字…),“謝謝大家!”如果將這篇發言交給一個單層的RNN網絡去學習,因為“首先”和“第二點”中間隔得實在太久,等到開始學習“第二點”時,網絡已經忘記了“簡單地說兩點”這個重要的信息,最終的結果就只剩下在風中凌亂了。。。于是我們決定加一個反向的網絡,從后開始往前聽,對于這層網絡,他首先聽到的就是“第二點”,然后是“首先”,最后,他對比了一下果然僅僅是“簡要地兩點”,在于前向的網絡進行結合,就深入學習了領導的指導精神。

上圖是一個雙向LSTM的結構圖,對于最后輸出的每個隱藏狀態 都是前向網絡和后向網絡的元組,即 其中每一個 或者 又是一個由隱藏狀態和細胞狀態組成的元組(或者是concat)。同樣最終的output也是需要將前向和后向的輸出concat起來的,這樣就保證了在最終時刻,無論是輸出還是隱藏狀態都是有考慮了上文和下文信息的。

下面就來看下tensorflow中已經集成的 tf.nn.bidirectional_dynamic_rnn() 函數。似乎雙向的暫時只有這一個動態的RNN方法,不過想想也能理解,這種結構暫時也只會在encoder端出現,無論你的輸入是pad到了定長或者是不定長的,動態RNN都是可以處理的。

具體的定義如下:

tf.nn.bidirectional_dynamic_rnn(
 cell_fw,
 cell_bw,
 inputs,
 sequence_length=None,
 initial_state_fw=None,
 initial_state_bw=None,
 dtype=None,
 parallel_iterations=None,
 swap_memory=False,
 time_major=False,
 scope=None
)

仔細看這個方法似乎和dynamic_rnn()沒有太大區別,無非是多加了一個bw的部分,事實上也的確如此。先看下前向傳播的部分:

with vs.variable_scope(scope or "bidirectional_rnn"):
 # Forward direction
 with vs.variable_scope("fw") as fw_scope:
  output_fw, output_state_fw = dynamic_rnn(
    cell=cell_fw, inputs=inputs, 
    sequence_length=sequence_length,
    initial_state=initial_state_fw, 
    dtype=dtype,
    parallel_iterations=parallel_iterations, 
    swap_memory=swap_memory,
    scope=fw_scope)

完全就是一個dynamic_rnn(),至于你選擇LSTM或者GRU,只是cell的定義不同罷了。而雙向RNN的核心就在于反向的bw部分。剛才說過,反向部分就是從后往前讀,而這個翻轉的部分,就要用到一個reverse_sequence()的方法,來看一下這一部分:

with vs.variable_scope("bw") as bw_scope:
 # ———————————— 此處是重點 ———————————— 
 inputs_reverse = _reverse(
   inputs, seq_lengths=sequence_length,
   seq_dim=time_dim, batch_dim=batch_dim)
 # ————————————————————————————————————
 tmp, output_state_bw = dynamic_rnn(
   cell=cell_bw, 
   inputs=inputs_reverse, 
   sequence_length=sequence_length,
   initial_state=initial_state_bw, 
   dtype=dtype,
   parallel_iterations=parallel_iterations,
   swap_memory=swap_memory,
   time_major=time_major, 
   scope=bw_scope)

我們可以看到,這里的輸入不再是inputs,而是一個inputs_reverse,根據time_major的取值,time_dim和batch_dim組合的 {0,1} 取值正好相反,也就對應了時間維和批量維的詞序關系。

而最終的輸出:

outputs = (output_fw, output_bw)
output_states = (output_state_fw, output_state_bw)

這里還有最后的一個小問題,output_states是一個元組的元組,我個人的處理方法是用c_fw,h_fw = output_state_fw和c_bw,h_bw = output_state_bw,最后再分別將c和h狀態concat起來,用tf.contrib.rnn.LSTMStateTuple()函數生成decoder端的初始狀態。

以上這篇雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • TensorFlow實現RNN循環神經網絡
  • Pytorch實現基于CharRNN的文本分類與生成示例
  • 淺談Tensorflow 動態雙向RNN的輸出問題

相關文章

  • 雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解

    雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解

    雙向RNN:bidirectional_dynamic_rnn()函數的使用詳解 先說下為什么要使用到雙向RNN,在讀一篇文章的時候,上文提到的信息十分的重要,但這些信息是不足以捕捉文章信
    2020-01-26
  • 關于tf.nn.dynamic_rnn返回值詳解

    關于tf.nn.dynamic_rnn返回值詳解

    函數原型 tf.nn.dynamic_rnn( cell, inputs, sequence_length=None, initial_state=None, dtype=None, parallel_iterations=None, swap_memory=Fal
    2020-01-26
  • python機器學習庫xgboost的使用

    python機器學習庫xgboost的使用

    1.數據讀取 利用原生xgboost庫讀取libsvm數據 import xgboost as xgb data = xgb.DMatrix(libsvm文件) 使用sklearn讀取libsvm數據 from sklearn.
    2020-01-26
  • 淺談Tensorflow 動態雙向RNN的輸出問題

    淺談Tensorflow 動態雙向RNN的輸出問題

    tf.nn.bidirectional_dynamic_rnn() 函數: def bidirectional_dynamic_rnn( cell_fw, # 前向RNN cell_bw, # 后向RNN inputs, # 輸入 sequence_length=No
    2020-01-26
  • python爬取本站電子書信息并入庫的實現代碼

    python爬取本站電子書信息并入庫的實現代碼

    入門級爬蟲:只抓取書籍名稱,信息及下載地址并存儲到數據庫 數據庫工具類:DBUtil.py import pymysql class DBUtils(object): def connDB(self):
    2020-01-26
  • TFRecord格式存儲數據與隊列讀取實例

    TFRecord格式存儲數據與隊列讀取實例

    Tensor Flow官方網站上提供三種讀取數據的方法 1. 預加載數據:在Tensor Flow圖中定義常量或變量來保存所有數據,將數據直接嵌到數據圖中,當訓練數據較大時,很消耗
    2020-01-26
  • 使用 tf.nn.dynamic_rnn 展開時間維度方式

    使用 tf.nn.dynamic_rnn 展開時間維度方式

    對于單個的 RNNCell , 使用色的 call 函數進行運算時 ,只是在序列時間上前進了一步 。 如使用 x1、 ho 得到此h1, 通過 x2 、 h1 得到 h2 等 。 tf.nn.dynamic_r
    2020-01-26
  • tensorflow ckpt模型和pb模型獲取節點名稱,及ckpt轉pb模型實例

    tensorflow ckpt模型和pb模型獲取節點名稱,及ckpt轉pb模型實例

    ckpt from tensorflow.python import pywrap_tensorflow checkpoint_path = 'model.ckpt-8000' reader = pywrap_tensorflow.NewCheckpointReader(checkpoint_pa
    2020-01-26
  • tensorflow模型繼續訓練 fineturn實例

    tensorflow模型繼續訓練 fineturn實例

    解決tensoflow如何在已訓練模型上繼續訓練fineturn的問題。 訓練代碼 任務描述: x = 3.0, y = 100.0, 運算公式 x×W+b = y,求 W和b的最優解。 # -*- coding: u
    2020-01-26
  • Python實現FLV視頻拼接功能

    Python實現FLV視頻拼接功能

    文章摘要 本文簡單說明了FLV文件的格式,以此為出發點,使用 Python 實現FLV視頻的拼接。 一.FLV文件格式 關于FLV文件格式的解析網上有諸多文章,在這里就簡單介紹一
    2020-01-26

最新評論