首页 > 解决方案 > 创建返回 RNN 数据序列的 Pytorch 数据集的正确方法?

问题描述

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

len(data) - seq_len + 1

,但是我觉得这有点“hacky”,应该有更合适的方法来做到这一点。这种方法似乎令人困惑,我觉得如果与小组合作会导致问题。更具体地说,我认为以某种方式覆盖 Pytorch Dataset 构造函数中的采样器函数是正确的方法,但我无法理解如何实现它。下面是我构建的当前数据集类,谁能指出我正确的方向以及如何修复它?先感谢您。

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]
    ]

标签: pythondeep-learningdatasetpytorchrnn

解决方案


如果我理解正确,您有时间序列数据,并且您想通过从中采样来创建具有相同长度的批量数据?我认为您可以使用Dataset只返回一个数据样本,因为它最初是 PyTorch 开发人员打算的。您可以使用自己的_collat​​e_fn函数将它们堆叠在批处理中,并将其传递给 DataLoader 类(_collat​​e_fn 是一个可调用的,它获取样本列表并返回批处理,例如,通常在那里完成填充)。所以你不会有长度的依赖(=你的数据集类中的批量大小)。我假设您想在形成批次时保留样本的顺序(假设您使用时间序列),您可以编写自己的Sampler类(或使用 PyTorch 中已有的 SequentialSampler)。因此,您将解耦您的样本表示,将它们形成一个批处理(DataLoader 中的_collat​​e_fn)和采样(Sampler 类)。希望这可以帮助。


推荐阅读