【发布时间】:2020-11-14 21:43:59
【问题描述】:
出于某种原因,我没有使用enumerate(data loader),而是为数据加载器创建迭代器。在下面显示的while 循环中,它给了我StopIteration 错误。
描述原因的简约代码:
loader = DataLoader(dataset, batch_size=args.batch_size)
dataloader_iter = iter(loader)
while(dataloader_iter):
X, y = next(dataloader_iter)
...
检查迭代器是否为空的正确条件(在 while 循环中指定)是什么?
【问题讨论】:
-
注意,
enumerate创建了一个迭代器,即一个enumerate对象。但它当然可以引发 StopIteration,这就是迭代器的工作方式。处理此问题的惯用方法是使用try-except StopIteration -
但是你为什么要这样迭代呢?为什么不
for X, y in dataloader_iter? -
注意,与其他语言不同,Python 中的迭代器协议并没有规定任何方法来检查迭代器是否为空,例如 Java 的
hasNext,相当于 @987654330 的 rasing @ 例外。 Python 通常会依赖于其他类似语言可能提供显式检查方式的异常。请注意,您可以使用next的第二个参数来提供一些标记值,例如next(iterator, None),但这不是惯用的 -
我这样迭代的原因是因为我的数据集中有一个损坏的条目(维度不匹配)。所以,每当我在做
enumerate(dataloader)时,它都会抛出一些错误。现在,我在next(dataloader_iter)周围使用try-catch来跳过该恶意条目。 -
啊,解包失败了。好的,使用它是一个足够简单的解决方案。请注意,您可以仍然使用枚举,它只返回一个迭代器(即
enumerate对象是迭代器)