首页 > 解决方案 > 是否可以使用 PyTorch 的 DataLoader 反向 drop_last?

问题描述

我目前正在尝试制作自定义 PyTorch DataLoader。

我知道drop_last=True第一次声明 DataLoader 对象时的设置会告诉对象在大小不合适的情况下删除最后一个不完整的批次。但是,我想知道这是否可以反过来完成,DataLoader 从后面计算批次数和计数。

我问这个的原因是因为我当前使用的数据是时间序列数据,我想使用最新的样本,因此如果从最旧的部分删除“剩余”样本将是理想的数据。

我已经想到了一些方法,比如先反转数据,然后创建 DataLoader 对象并将其反转回原来的样子,或者首先反转数据并创建对象,然后idx以相反的顺序输入running __getitem__,但这似乎很麻烦并且容易出错,所以我想知道 PyTorch 是否提供这种行为。

提前致谢。

标签: pytorchdataloader

解决方案


计算将被删除的样本数量相对简单。一旦你有了那个数字,你就可以torch.utils.data.Subset从一开始就截断你的数据。例如

batch_size = ... # your batch size
dataset = ... # your dataset

# compute number of samples to remove
dropped_samples = len(dataset) - batch_size * int(len(dataset) // batch_size)

subset_dataset = torch.utils.data.Subset(dataset, range(dropped_samples, len(dataset)))
loader = torch.utils.data.DataLoader(subset_dataset, ...

在这种情况下,设置drop_last=True将无效,因为len(subset_dataset)它可以被 整除batch_size


推荐阅读