创建返回RNN数据序列的Pytorch数据集的正确方法?

时间:2018-08-20 22:00:30

标签: python deep-learning dataset pytorch rnn

我正在尝试训练RNN上的时间序列数据,尽管那里有很多关于如何构建RNN模型的教程,但是在为该任务构建dataloader对象时遇到了一些麻烦。数据将全部具有相同的长度,因此也无需填充。到目前为止,我采取的方法是在数据集类的 getitem 函数中返回一系列数据,并将长度定义为

len(data) - seq_len + 1

,但是我觉得这有点“棘手”,应该有一种更合适的方法来做到这一点。这种方法似乎令人困惑,我认为如果与小组合作,这会引起问题。更具体地说,我认为以某种方式覆盖Pytorch Dataset构造函数中的sampler函数是正确的方法,但是我在理解如何实现该方法时遇到了麻烦。以下是我建立的当前数据集类,谁能指出正确的解决方法?预先谢谢你。

class CustomDataset(Dataset):
  def __init__(self, df, cats, y, seq_l):
    self.n, self.seq_l = len(df), seq_l
    self.cats  = np.array(np.stack([c.values for n,c in df[cats].items()], 1).astype(np.int64))
    self.conts = np.array(np.stack([c.values for n,c in df[[i for i in df.columns if i not in cats]].items()], 1).astype(np.float32))
    self.y = np.array(y)

  def __len__(self): return len(self.y) - self.seq_l + 1

  def __getitem__(self, idx):
    return [
      (torch.from_numpy(self.cats[idx:idx+self.seq_l]),
      torch.from_numpy(self.conts[idx:idx+self.seq_l])),
      self.y[idx+self.seq_l-1]
    ]

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您就有时间序列数据,并且想通过从中取样来创建具有相同长度的数据批吗? 我认为您可以使用 Dataset 来仅返回一个数据样本,就像PyTorch开发人员最初打算的那样。您可以使用自己的 _collat​​e_fn 函数将它们堆叠在批处理中,然后将其传递到DataLoader类(_collat​​e_fn是可调用的方法,该方法将获取示例列表并返回一个批处理,例如,通常执行填充操作那里)。因此,您将没有长度的依赖关系(=数据集类中的批量大小)。我假设您要在形成批处理时保留样品的顺序(假设您使用时间序列),可以编写自己的 Sampler 类(或使用PyTorch中已提供的SequentialSampler)。 结果,您将解耦样本表示,将它们成批(在DataLoader中为_collat​​e_fn)形成并进行采样(Sampler类)。希望这会有所帮助。