我目前正在尝试制作一个自定义PyTorch数据加载器。
我知道,在第一次声明DataLoader对象时设置drop_last=True
会告诉对象,如果大小不合适,则丢弃最后一个不完整的批。然而,我想知道是否可以反过来做,DataLoader从后面计算批次数和计数。
我之所以这么问,是因为我目前使用的数据是时间序列数据,我想使用最新的样本,因此,如果从数据的最旧部分中删除"剩余"样本,那将是理想的选择。
我想了一些方法,比如先反转数据,然后创建DataLoader对象并将其反转回原来的状态,或者在运行__getitem__
时先反转数据并创建对象,然后按相反的顺序输入idx
,但这似乎很麻烦,而且容易出错,所以我想知道PyTorch是否提供了这种行为。
提前谢谢。
计算将被删除的样本数量相对简单。一旦有了这个数字,就可以使用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
整除。