dylanin1999

导航

Tensorflow中的dynamic_rnn和rnn有什么区别

在每一个train_step中,传入model的是一个batch的数据,在这一个batch内的数据一定是padding成相同的长度的。

 

那么,如果可以只在一个batch内部进行padding,例如一个batch中数据长度均在6-10这个范围内,就可以让这个batch中所有数据pad到固定长度10,而整个dataset上的数据最大长度很可能是100,这样就不需要让这些数据也pad到100那么长,白白浪费空间。

所以dynamic_rnn实现的功能就是可以让不同迭代传入的batch可以是长度不同数据,但同一次迭代一个batch内部的所有数据长度仍然是固定的。例如,第一时刻传入的数据shape=[batch_size, 10],第二时刻传入的数据shape=[batch_size, 12],第三时刻传入的数据shape=[batch_size, 8]等等。

但是rnn不能这样,它要求每一时刻传入的batch数据的[batch_size, max_seq],在每次迭代过程中都保持不变。

这样不就必须要求全部数据都要pad到统一的max_seq长度了吗?是的,但也有个折中办法。

——将数据集的sequence length做个初步统计,看会落在哪几个区间段内。然后根据区间段将数据进行归类,也就是所谓的放在不同buckets中。

最后用rnn为每一个buckets都创建一个sub graph。训练的时候,根据当前batch data所归属的bucket id,找到它对应的sub graph,进行参数更新(虽然是不同的sub graph,但参数是共享的。至少tensorflow中是这么实现的~\(≧▽≦)/~)


参考连接:https://www.zhihu.com/question/52200883

posted on 2022-08-13 16:15  DylanYeung  阅读(32)  评论(0编辑  收藏  举报