調用static_rnn實際上是生成了rnn按時間序列展開之后的圖。打開tensorboard你會看到sequence_length個rnn_cell stack在一起,只不過這些cell是share weight的。因此,sequence_length就和圖的拓撲結構綁定在了一起,因此也就限制了每個batch的sequence_length必須是一致。
調用dynamic_rnn不會將rnn展開,而是利用tf.while_loop這個api,通過Enter, Switch, Merge, LoopCondition, NextIteration等這些control flow的節點,生成一個可以執行循環的圖(這個圖應該還是靜態圖,因為圖的拓撲結構在執行時是不會變化的)。在tensorboard上,你只會看到一個rnn_cell, 外面被一群control flow節點包圍着。對於dynamic_rnn來說,sequence_length僅僅代表着循環的次數,而和圖本身的拓撲沒有關系,所以每個batch可以有不同sequence_length。
鏈接:https://www.zhihu.com/question/52200883/answer/251068217