torch.utils.data.DataLoader与迭代器转换操作
作者:Orion's?Blog 发布时间:2021-01-18 11:02:34
标签:torch.utils.data.DataLoader,迭代器转
在做实验时,我们常常会使用用开源的数据集进行测试。而Pytorch中内置了许多数据集,这些数据集我们常常使用DataLoader
类进行加载。
如下面这个我们使用DataLoader
类加载torch.vision
中的FashionMNIST
数据集。
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
training_data = datasets.FashionMNIST(
? ? root="data",
? ? train=True,
? ? download=True,
? ? transform=ToTensor()
)
test_data = datasets.FashionMNIST(
? ? root="data",
? ? train=False,
? ? download=True,
? ? transform=ToTensor()
)
我们接下来定义Dataloader对象用于加载这两个数据集:
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)
那么这个train_dataloader
究竟是什么类型呢?
print(type(train_dataloader)) ?# <class 'torch.utils.data.dataloader.DataLoader'>
我们可以将先其转换为迭代器类型。
print(type(iter(train_dataloader)))# <class 'torch.utils.data.dataloader._SingleProcessDataLoaderIter'>
然后再使用next(iter(train_dataloader))
从迭代器里取数据,如下所示:
train_features, train_labels = next(iter(train_dataloader))
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")
可以看到我们成功获取了数据集中第一张图片的信息,控制台打印:
Feature batch shape: torch.Size([64, 1, 28, 28])
Labels batch shape: torch.Size([64])
Label: 2
图片可视化显示如下:
不过有读者可能就会产生疑问,很多时候我们并没有将DataLoader类型强制转换成迭代器类型呀,大多数时候我们会写如下代码:
for train_features, train_labels in train_dataloader:?
? ? print(train_features.shape) # torch.Size([64, 1, 28, 28])
? ? print(train_features[0].shape) # torch.Size([1, 28, 28])
? ? print(train_features[0].squeeze().shape) # torch.Size([28, 28])
? ??
? ? img = train_features[0].squeeze()
? ? label = train_labels[0]
? ? plt.imshow(img, cmap="gray")
? ? plt.show()
? ? print(f"Label: {label}")
可以看到,该代码也能够正常迭代训练数据,前三个样本的控制台打印输出为:
torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 7
torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 4
torch.Size([64, 1, 28, 28])
torch.Size([1, 28, 28])
torch.Size([28, 28])
Label: 1
那么为什么我们这里没有显式将Dataloader
转换为迭代器类型呢,其实是Python语言for循环的一种机制,一旦我们用for ... in ...句式来迭代一个对象,那么Python
解释器就会偷偷地自动帮我们创建好迭代器,也就是说
for train_features, train_labels in train_dataloader:
实际上等同于
for train_features, train_labels in iter(train_dataloader):
更进一步,这实际上等同于
train_iterator = iter(train_dataloader)
try:
? ? while True:
? ? ? ? train_features, train_labels = next(train_iterator)
except StopIteration:
? ? pass
推而广之,我们在用Python迭代直接迭代列表时:
for x in [1, 2, 3, 4]:
其实Python解释器已经为我们隐式转换为迭代器了:
list_iterator = iter([1, 2, 3, 4])
try:
? ? while True:
? ? ? ? x = next(list_iterator)
except StopIteration:
? ? pass
来源:https://www.cnblogs.com/orion-orion/p/15651037.html
0
投稿
猜你喜欢
- 有过网页制作经验的朋友一定知道:一般来讲,把表格的边框定义为1px时,即border=1,而实际上是2
- 闲暇时间用tkinter写了个简易计算器,可实现简单的加减乘除运算,用了Button和Entry2个控件,下面是代码,只是简单的用了偏函数p
- 错误信息UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xce i
- 我有两个继承一个基类的Django模型:- Request- Inquiry- Analysis请求有两个外键到内置用户模型。create_
- 从两个优秀的世界各取所需,更高效的复用代码。想想就醉了,.NET和python融合了。“懒惰”的程序员们,还等什么?Jesse Smith为
- 今天介绍Python当中十大可视化工具,每一个都独具特色,惊艳一方。MatplotlibMatplotlib 是 Python 的一个绘图库
- 知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的。每次我需要做任何关于web的自动任务时,我都使用这段python
- 解决中文乱码问题项目地址 github: https://github.com/Delgan/loguru文档:https://loguru
- 一、迭代器(Iterator)1.1 可迭代对象(Iterable)可迭代对象,可以简单理解为可遍历对象,即能够使用 for 循环遍历的对象
- 前言想要使用摄像头实现一个多人姿态识别环境安装下载并安装 Anaconda官网连接 https://anaconda.cloud/insta
- 问:如何给导入文件加上时间戳标记?答:请参考下文中介绍的两种方法:1.在DOS下从系统获得时间戳利用Dos命令取得时间戳:C:\>ec
- 有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情
- 《用户研究角度看设计》系列是淘宝的用户研究团队在可用性测试之后的点滴思考。在每次与淘宝用户的直接接触、观察用户的操作之后,作为体验分析师的我
- 有几个原因促使我们使用自定义的select控件来代替原生的select控件:在ie6下select是一个窗口级的元素,绝对定位的层会被sel
- 在python中使用socket进行linux服务器与win10主机间的图像传输,供大家参考,具体内容如下前提:服务器与主机需要在同一局域网
- 在windows下安装配置Ulipad今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。Ulipad下载地址
- 异常处理简介在我们写程序代码的时候,往往会因一个小问题让我们整个程序直接挂掉。异常处理对我们测试有什么好处,相信做过自动化的同学都知道我们的
- 用python搭建百万答题、自动百度搜索答案。使用平台windows7python3.6MIX2手机代码原理手机屏幕内容同步到pc端对问题截
- 我就废话不多说了,大家还是直接看代码吧~'''Created on 2018-4-16'''
- 一、背景大家好,我是J哥。也许你还记得,前不久复旦大学一博士生写了130行Python代码,批量识别核酸截图内容的故事。当时还被人民日报公众