在cifar10教程中,images, labels
是如何被赋值的?
trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=4, shuffle=True, num_workers=2)def imshow(img): img = img / 2 + 0.5 # 非标准化 npimg = img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0)))# 获取一些随机的训练图像dataiter = iter(trainloader)images, labels = dataiter.next()
最后一行是如何知道自动将images, labels
赋值给images, labels = dataiter.next()
的?
我检查了DataLoader
类和DataLoaderIter
类,但我想我需要更多关于迭代器的一般知识。
回答:
我认为理解可迭代对象和迭代器之间的区别是至关重要的。可迭代对象是你可以迭代的对象。迭代器是一个用于通过__next__方法迭代可迭代对象的对象,该方法返回对象的下一个项目。
一个简单的例子如下。考虑一个可迭代对象,并使用next方法调用列表中的下一个项目。这将打印下一个项目,直到列表结束。如果达到末尾,它将引发StopIteration错误。
test = (1,2,3)tester = iter(test)while True: nextItem = next(tester) print(nextItem)
您上面提到的类可能有类似的实现,但是它返回一个包含图像和标签的元组。