我目前正在尝试制作自定义PyTorch DataLoader。
我知道,在首次声明DataLoader对象时设置drop_last=True
会告诉该对象,如果大小不合适,则删除最后一个不完整的批处理。但是,我想知道这是否可以反向完成,DataLoader在那里从背面计算批次数和计数。
之所以这样问,是因为我当前使用的数据是时间序列数据,并且我想使用最新的样本,因此,如果将“剩余”样本从数据的最旧部分。
我已经想到过一些方法,例如,首先反转数据,然后创建DataLoader对象,然后将其反转回原来的状态,或者首先反转数据并创建对象,然后输入{{1 }}在运行idx
时顺序相反,但这似乎很麻烦并且容易出错,所以我想知道PyTorch是否提供这种行为。
谢谢。
答案 0 :(得分:0)
计算将要删除的样本数量相对简单。一旦有了该数字,就可以使用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
整除。