为 RNN 创建 returns 数据序列的 Pytorch 数据集的正确方法?

Correct way to create Pytorch dataset that returns sequence of data for RNN?

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

len(data) - seq_len + 1

,但我觉得这有点"hacky",应该有更合适的方法来做到这一点。这种方法看起来很混乱,我觉得如果与团队合作,这会导致问题。更具体地说,我认为以某种方式覆盖 Pytorch 数据集构造函数中的采样器函数是正确的方法,但我无法理解如何实现它。以下是我构建的当前数据集 class,任何人都可以指出正确的方向以及如何修复它吗?提前谢谢你。

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

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