dynamic_rnn讓不同迭代傳入的batch的長度可以不同,但是同一次迭代的一個batch內部的所有數據的長度仍然是固定的。 例如一個batch中數據長度均在7-10這個範圍內,就可以將這個batch的長度固定為10,而整個dataset上的數據最大長度可能是100, 這樣不需要將這個batch中的數據長度固定到100,浪費空間。 但是rnn不能這樣,它要求每一時刻傳入的batch數據的[batch_size, max_seq],在每次迭代過程中都保持不變。 我們用一個小例子來說明其用法,假設你的RNN的輸入input是[2,20,128],其中2是batch_size,20是文本最大長度,128是embedding_size,可 以看出,有兩個example,我們假設第二個文本長度只有13,剩下的7個是使用0-padding方法填充的。dynamic返回的是兩個參數: outputs,last_states,其中outputs是[2,20,128],也就是每一個迭代隱狀態的輸出,last_states是由(c,h)組成的tuple,均為[batch,128]。 到這裡並沒有什麼不同,但是dynamic有個參數:sequence_length,這個參數用來指定每個example的長度,比如上面的例子中,我們令 sequence_length為[20,13],表示第一個example有效長度為20,第二個example有效長度為13,當我們傳入這個參數的時候,對於第二個 example,TensorFlow對於13以後的padding就不計算了,其last_states將重複第13步的last_states直至第20步,而outputs中超過13步的結果 將會被置零。 dynamic_rnn例子

輸出結果

可以看出,對於第二個example超過6步的outputs,是直接被設置成0了,而last_states將7-10步的輸出重複第6步的輸出。可見節省了不少的計 算開銷 使用tf.dynamic_rnn顯然比其他的RNN來的更方便和節約計算資源,因此推薦優先使用tf.dynamic_rnn


推薦閱讀:
相关文章