gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:07:26 25 4
gpt4 key购买 nike

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

len(data) - seq_len + 1

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

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 开发人员的意图。您可以使用自己的 _collat​​e_fn 函数将它们堆叠在批处理中,并将其传递给 DataLoader 类(_collat​​e_fn 是一个可调用函数,它获取样本列表并返回一个批处理,通常,例如,填充完成那里)。因此,您不会依赖于长度(=数据集类中的批量大小)。我假设您希望在形成批处理时保留样本的顺序(假设您使用时间序列),您可以编写自己的 Sampler 类(或使用 PyTorch 中已有的 SequentialSampler)。因此,您将解耦样本表示,将它们批量形成(DataLoader 中的 _collat​​e_fn)并采样(Sampler 类)。希望这会有所帮助。

关于python - 创建为 RNN 返回数据序列的 Pytorch 数据集的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com