在建立时序模型时,若使用keras,我们在Input的时候就会在shape内设置好sequence_length(后面简称seq_len),接着便可以在自定义的data_generator内进行个性化的使用。这个值同时也就是time_steps,它代表了RNN内部的cell的数量,有点懵的朋友可以再去看看RNN的相关内容:个人总结:从RNN(内含BPTT以及梯度消失/爆炸)到 LSTM(内含GRU)Seq2Seq Attention
所以设定好这个值是很重要的事情,它和batch_size,feature_dimensions(在词向量的时候就是embedding_size了)构成了我们Input的三大维度,无论是keras/tensorflow,亦或是Pytorch,本质上都是这样。
牵涉到这个问题是听说Pytorch自由度更高,最近在做实验的时候开始尝试用Pytorch了,写完代码跑通后,过了段时间才意识到,好像没有用到seq_len这个参数,果然是Keras用多了的后遗症?!(果然是博主比较蠢!)检查了一下才发现,DataLoader生成数据的时候,默认生成为(batch_size, 1, feature_dims)。(这里无视了batch_size和seq_len的顺序,在建立模型的时候,比如nn.LSTM有个batch_first的参数,它决定了谁前谁后,但这不是我们这里讨论的重点)。
所以我们的seq_len/time_steps被默认成了1,这是在使用Pytorch的时候容易发生的问题,由于Keras先天的接口设置在Input时就让我们无脑设置seq_len,这反而不会成为我们在使用Keras时发生的问题,而Pytorch没有让我们在哪里设置这个参数,所以一不小心可能就忽视了。
好了,接下来就来找找问题怎么出现的,又怎么解决。果然问题还是出现在了DataLoader,在__getitem__(self, index)这里,决定了我们如何取出数据,这里我发现我自己还是用的最简单的方式一条一条取的。