我想保存PyTorch的
torch.utils.data.dataloader.DataLoader
实例,以便我可以在之前保留的情况下继续训练(包括随机种子、状态等)。torch.utils.data.dataloader.DataLoader
实例,以便我可以在之前保留的情况下继续训练(包括随机种子、状态等)。sampler = ResumableRandomSampler(dataset)
loader = torch.utils.data.DataLoader(dataset, batch_size=2, sampler=sampler, pin_memory=True)
for x in loader:
print(x)
break
sampler2 = ResumableRandomSampler(dataset)
torch.save(sampler.get_state(), "test_samp.pth")
sampler2.set_state(torch.load("test_samp.pth"))
loader2 = torch.utils.data.DataLoader(dataset, batch_size=2, sampler=sampler2, pin_memory=True)
for x in loader2:
print(x)
采样器
,它会获取起始索引并自行随机打乱数据:import random
from torch.utils.data.dataloader import Sampler
random.seed(224) # use a fixed number
class MySampler(Sampler):
def __init__(self, data, i=0):
random.shuffle(data)
self.seq = list(range(len(data)))[i * batch_size:]
def __iter__(self):
return iter(self.seq)
def __len__(self):
return len(self.seq)
现在将最后的索引i
保存在某个地方,下次使用它实例化DataLoader
:
train_dataset = MyDataset(train_data)
train_sampler = MySampler(train_dataset, last_i)
train_data_loader = DataLoader(dataset=train_dataset,
batch_size=batch_size,
sampler=train_sampler,
shuffle=False) # don't forget to set DataLoader's shuffle to False
在Colab上进行培训非常有用。
i
,它是10。然后您只取大于该值的所有索引,对其进行洗牌,并选择接下来的10个。但您不知道这10个是哪些。这很容易解决,在固定种子的情况下,在洗牌后进行子选择。 - fsocietydata
(这就是固定随机种子的含义),我们将得到相同的索引顺序。在这种情况下,i
始终表示相同的索引。因此,在选择第i
个元素之前总是进行洗牌。 - edoost