我不确定您是要在网络训练以外的其他地方使用数据集(例如检查图像)还是要在训练期间迭代批次。
遍历数据集
要么按照 Usman Ali 的回答(可能会溢出)你的记忆,要么你可以这样做
for i in range(len(dataset)): # or i, image in enumerate(dataset)
images, labels = dataset[i] # or whatever your dataset returns
您可以编写dataset[i],因为您在Dataset 类中实现了__len__ 和__getitem__(只要它是Pytorch Dataset 类的子类)。
从数据加载器中获取所有批次
我理解您的问题的方式是您想要检索所有批次来训练网络。您应该了解iter 为您提供了数据加载器的迭代器(如果您不熟悉迭代器的概念,请参阅wikipedia entry)。 next 告诉迭代器给你下一个项目。
因此,与遍历列表的迭代器相比,数据加载器总是返回下一项。列表迭代器在某个时候停止。我假设您有一些类似的时期和每个时期的步数。那么您的代码将如下所示
for i in range(epochs):
# some code
for j in range(steps_per_epoch):
images, labels = next(iter(dataloader))
prediction = net(images)
loss = net.loss(prediction, labels)
...
小心next(iter(dataloader))。如果您想遍历列表,这也可能有效,因为 Python 会缓存对象,但每次从索引 0 开始时,您最终都会得到一个新的迭代器。为了避免这种情况,将迭代器取出到顶部,如下所示:
iterator = iter(dataloader)
for i in range(epochs):
for j in range(steps_per_epoch):
images, labels = next(iterator)