v1.0中 tensorflow漸漸廢棄了老的非dynamic的seq2seq接口,已經放到 tf.contrib.legacy_seq2seq目錄下面。 函數
tf.contrib.seq2seq下面的實現都是dynamic seq2seq接口。 性能
按照google的rd說法下個月將會給出更加完善的接口和實現。 google
當前版本也可使用這裏嘗試分析一下現有dynamic seq2seq的代碼。 spa
首先核心函數是seq2seq.py下面的 dynamic_rnn_decoder code
這裏首先看下dynamic的概念,即不須要肯定的輸入長度,以及batch 大小, 均可以動態。 接口
可是注意首先每一個batch對應全部樣本的輸入長度仍是須要同樣的 做爲dense數據 不然 不可處理 io
這也就是說若是你須要特別在乎速度的話,即便使用dyanmic 也可能還須要使用bucket來彙集類似長度的 ast
輸入樣本做爲一個batch 加速訓練。 基礎
不過通常意義上不用的話,代碼比較簡單,加上dyanmic的seq2seq 性能也能夠接受,同時好處是每一個batch tensorflow
的樣本能夠徹底隨機。
dynamic_rnn_decoder核心是內部調用raw_rnn來實現迭代過程,這裏的dynamic最主要體如今輸入的
decoder_fn函數上面。
這個函數容許計算提早終止(early stop) 也就是說 假如你作inference,不用dynamic seq2seq
你通常的作法是指定一個 最大decode長度 好比20, 那麼對應全部樣本其實都須要decode走完20個
Step 哪怕全部的樣本對應輸出序列長度都不大於10。
而有了dynamic decode 當一個batch 全部的樣本decode到達 相似<END>結束符以後,整個decode過程就
結束了。
可是注意這裏仍然是以batch爲基礎的,也就是說有一個樣本好比decode 2次就到達結束符,可是因爲
組內其它樣本沒有結束,仍然須要全部樣本繼續向後解析,也就是說batch size越大,結束的可能越晚。
dynamic_rnn_decoder有train和inference兩種模式,不過若是不使用attention,我的感受train的時候直接
用dynamic_rnn接口就能夠了。
最後按照剛剛master的代碼,seq2seq提供了decoder.py以及sampling_decoder.py等相關的示例,
這個接口更加簡潔清晰,也就是說再也不用context_state來記錄用戶其他的狀態,而是用戶自定義
output的結構 將其它信息也直接寫入output。
mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm