【问题标题】:What does next() and iter() do in PyTorch's DataLoader()PyTorch DataLoader() 中的 next() 和 iter() 做了什么
【发布时间】:2020-10-14 09:55:57
【问题描述】:

我有以下代码:

import torch
import numpy as np
import pandas as pd
from torch.utils.data import TensorDataset, DataLoader

# Load dataset
df = pd.read_csv(r'../iris.csv')

# Extract features and target
data = df.drop('target',axis=1).values
labels = df['target'].values

# Create tensor dataset
iris = TensorDataset(torch.FloatTensor(data),torch.LongTensor(labels))

# Create random batches
iris_loader = DataLoader(iris, batch_size=105, shuffle=True)

next(iter(iris_loader))

next()iter() 在上面的代码中做了什么?我已经通过PyTorch's documentation 并且仍然可以完全理解next()iter() 在这里做什么。谁能帮忙解释一下?非常感谢。

【问题讨论】:

    标签: python iterator pytorch next dataloader


    【解决方案1】:

    这些是 python 的内置函数,它们用于处理迭代。

    基本上iter() 调用__iter__() 上的方法iris_loader 返回一个迭代器。 next() 然后在该迭代器上调用 __next__() 方法以获取第一次迭代。再次运行next()会得到迭代器的第二项,以此类推

    这种逻辑经常发生在“幕后”,例如在运行for 循环时。它在迭代器上调用__iter__() 方法,然后在返回的迭代器上调用__next__(),直到它到达迭代器的末尾。然后它引发stopIteration 并且循环停止。

    有关更多详细信息和一些细微差别,请参阅文档:https://docs.python.org/3/library/functions.html#iter

    【讨论】:

    • 感谢@ScootCork。所以简单来说,我可以说iter() 只是迭代一个新的随机批次,next() 在输出中显示这个新的随机批次吗?
    • 术语在这里很重要,iris_loader 是一个可迭代对象,将其传递给 iter() 会返回一个迭代器,您可以对其进行迭代。您可以将这两个功能分开以更好地了解正在发生的事情。 i = iter(iris_loader) 然后next(i)。如果您在笔记本中以交互方式运行它,请尝试再运行几次next(i)。每次运行 next(i) 时,它都会返回下一批大小为 105 的迭代器,直到没有剩余批次为止。
    • 太棒了@ScootCork,现在这更有意义了。非常感谢您的详细解释。
    猜你喜欢
    • 2018-12-28
    • 1970-01-01
    • 2011-11-08
    • 2017-01-05
    • 2018-10-12
    • 2023-02-14
    • 2019-04-16
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多