v1.0中 tensorflow漸漸廢棄了老的非dynamic的seq2seq接口,已經放到 tf.contrib.legacy_seq2seq目錄下面。
tf.contrib.seq2seq下面的實現都是dynamic seq2seq接口。
按照google的rd說法下個月將會給出更加完善的接口和實現。
當前版本也可以使用這里嘗試分析一下現有dynamic seq2seq的代碼。
首先核心函數是seq2seq.py下面的 dynamic_rnn_decoder
這里首先看下dynamic的概念,即不需要確定的輸入長度,以及batch 大小, 都可以動態。
但是注意首先每個batch對應所有樣本的輸入長度還是需要一樣的 作為dense數據 否則 不可處理
這也就是說如果你需要特別在意速度的話,即使使用dyanmic 也可能還需要使用bucket來聚集相似長度的
輸入樣本作為一個batch 加速訓練。
不過一般意義上不用的話,代碼比較簡單,加上dyanmic的seq2seq 性能也可以接受,同時好處是每個batch
的樣本可以完全隨機。
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