首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pytorch中的分布式顺序窗口数据

pytorch中的分布式顺序窗口数据
EN

Stack Overflow用户
提问于 2022-04-20 06:31:49
回答 1查看 219关注 0票数 0

在我培训的每一个时代,我都需要将我的数据集分割成n批次的t连续样本。例如,如果我的数据是[1,2,3,4,5,6,7,8,9,10]n = 2t = 3,那么有效的批将是

代码语言:javascript
复制
[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时间。

代码语言:javascript
复制
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。在非分布式场景中,我可以

代码语言:javascript
复制
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]?第一种情况对我来说是可以的,因为样本是连续的,但第二种情况不会。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-24 03:50:14

最后,我创建了自己的Dataset,其中的数据是[t, t + window, ... t + n * window]。每次调用它时,它都会将窗口的开始索引随机化。然后,采样器像往常一样进行洗牌。为了重现性,它有一个类似于采样器set_epochset_epoch方法。

代码语言:javascript
复制
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

下面的版本将调用之外的数据随机化,而且速度要快得多。

代码语言:javascript
复制
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.size
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71935107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档