在我培训的每一个时代,我都需要将我的数据集分割成n批次的t连续样本。例如,如果我的数据是[1,2,3,4,5,6,7,8,9,10]、n = 2和t = 3,那么有效的批将是
[1-2-3, 4-5-6] and [7-8-9, 10-1-2]
[2-3-4, 8-9-10] and [5-6-7, 1-2-3]我的旧版本如下所示,但它对数据中的每个点进行了采样,这意味着我将在每个时代解析整个数据集t时间。
train_dataset = list(range(n))
train_sampler = None
if distributed:
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
train_loader = torch.utils.data.DataLoader(
train_dataset, batch_size=bsize, shuffle=(train_sampler is None),
pin_memory=True, sampler=train_sampler)
for epoch in range(epochs):
if distributed:
train_sampler.set_epoch(epoch)
for starting_i in train_loader:
batch = np.array([np.mod(np.arange(i, i + t), n) for i in starting_i])我现在已经实现了自己的抽样功能,它将数据分割成随机批,其中每个样本都远离两个最接近的t。在非分布式场景中,我可以
for epoch in range(epochs):
pad = np.random.randint(n)
train_loader = np.mod(np.arange(pad, n + pad, t), n)
np.random.shuffle(train_loader)
train_loader = np.array_split(train_loader,
np.ceil(len(train_loader) / bsize))
for starting_i in train_loader:
batch = np.array([np.mod(np.arange(i, i + t), n) for i in starting_i])如何使此版本分发?我需要定制torch.nn.parallel.DistributedDataParallel还是torch.utils.data.DataLoader?
我已经检查了DistributedSampler类,我的猜测是我必须重写__iter__方法。我说的对吗?
DistributedSampler如何分割数据集?它是按顺序排列在num_replicas中吗?说num_replicas = 2吧。我的数据集会在两个工人之间分成[1,2,3,4,5]和[6,7,8,9,10]吗?还是随机的?比如[1,4,7,3,10]和[2,9,5,8,6]?第一种情况对我来说是可以的,因为样本是连续的,但第二种情况不会。
发布于 2022-04-24 03:50:14
最后,我创建了自己的Dataset,其中的数据是[t, t + window, ... t + n * window]。每次调用它时,它都会将窗口的开始索引随机化。然后,采样器像往常一样进行洗牌。为了重现性,它有一个类似于采样器set_epoch的set_epoch方法。
class SequentialWindowedDataset(Dataset):
def __init__(self, size, window):
self.size = size
self.window = window
self.seed = 0
self.data = np.arange(0, self.size, self.window)
def __getitem__(self, index):
rng = np.random.default_rng(self.seed)
pad = rng.integers(0, self.size)
data = (self.data + pad) % self.size
return data[index]
def __len__(self):
return len(self.data)
def set_seed(self, seed):
self.seed = seed下面的版本将调用之外的数据随机化,而且速度要快得多。
class SequentialWindowedDataset(Dataset):
def __init__(self, size, window):
self.size = size
self.window = window
self.data = np.arange(0, self.size, self.window)
def __getitem__(self, index):
return self.data[index]
def __len__(self):
return len(self.data)
def randomize(self, seed):
rng = np.random.default_rng(seed)
pad = rng.integers(0, self.size)
self.data = (self.data + pad) % self.sizehttps://stackoverflow.com/questions/71935107
复制相似问题