【问题标题】:Pythonic way to start an iterator from an specific index从特定索引启动迭代器的 Pythonic 方式
【发布时间】:2020-08-30 12:16:45
【问题描述】:

我正在尝试更改this code,因此142 行中的函数sample_real_video_batch 中的迭代器将从特定的批号开始(而不是数据集的开始)。 这是函数:

def sample_real_video_batch(self):
    if self.video_enumerator is None:
        self.video_enumerator = enumerate(self.video_sampler)

    batch_idx, batch = next(self.video_enumerator)
    b = batch
    if self.use_cuda:
        for k, v in batch.iteritems():
            b[k] = v.cuda()

    if batch_idx == len(self.video_sampler) - 1:
        self.video_enumerator = enumerate(self.video_sampler)

    return b

一个明显且非常低效的方法是在循环中调用函数n 次。但一般来说,有没有一种有效的方法可以从 python 中的特定索引启动迭代器?

它是否适用于pytorch ImageDataset

【问题讨论】:

  • 请将您的代码作为 text 发布在这里。您和我们复制粘贴比照片/代码链接更容易;更重要的是,没有死链接的风险。
  • @Austin 感谢您的评论,我已添加代码。
  • 你不想传入索引并切片self.video_sampler吗?
  • @Austin self.video_samplertorch.utils.data.Dataset 的子类的一个实例。我不确定如何对数据集对象进行切片。
  • 您可以使用itertools.islice 从迭代器中消耗特定数量的元素。

标签: python iterator pytorch


【解决方案1】:

正如 Paul M 在 cmets 中提到的,itertools.islice() 可用于消耗特定的元素切片。

至于我问题的第二部分,显然唯一的方法是使用SequentialSampler,它在shuffle=False 在pytorch DataLoader 中默认使用。因此,需要先创建一个 SequentialSampler 并考虑数据集的一部分,然后再创建一个常规的 Dataloader 用于其余数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2019-08-18
    • 2014-01-15
    • 2018-11-28
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多