python - 创建返回 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]
]
解决方案
如果我理解正确,您有时间序列数据,并且您想通过从中采样来创建具有相同长度的批量数据?我认为您可以使用Dataset只返回一个数据样本,因为它最初是 PyTorch 开发人员打算的。您可以使用自己的_collate_fn函数将它们堆叠在批处理中,并将其传递给 DataLoader 类(_collate_fn 是一个可调用的,它获取样本列表并返回批处理,例如,通常在那里完成填充)。所以你不会有长度的依赖(=你的数据集类中的批量大小)。我假设您想在形成批次时保留样本的顺序(假设您使用时间序列),您可以编写自己的Sampler类(或使用 PyTorch 中已有的 SequentialSampler)。因此,您将解耦您的样本表示,将它们形成一个批处理(DataLoader 中的_collate_fn)和采样(Sampler 类)。希望这可以帮助。
推荐阅读
- mongodb - Golang MGO 模块是否锁定或解锁 Go 对象?
- php - php循环中的第一个选择即将结束
- vsphere - Vsphere html 网页客户端 6.7 sdk
- android - Android:检测应用程序的内存是否已被修改
- xml - 如何使用 ASP.NET 从 XML 文件中检索特定数据
- html - 带有 vmin 和移动地址栏的响应式设计
- asp.net - 更改 ASP.NET Core Web 应用中的启动错误页面
- google-cloud-platform - 是否跨项目计算持续使用折扣?
- node.js - 如何在 Firebase 函数中与 firestore + pdfmake 一起使用 Promise
- java - 如何将网页保存为 Web 存档,然后使用 Android 的 WebView 将 Web 存档显示为网页?