PyTorch - 14 - CNN图像准备代码项目 - 学习提取,转换,加载(Extract, Transform, Load : ETL)
The ETL Process
在这篇文章中,我们将通过准备数据开始。 为了准备我们的数据,我们将遵循被称为ETL流程的内容。
- 从数据源
提取
数据。 - 将数据
转换
为所需的格式。 - 将数据
加载
到合适的结构中。
ETL过程
可以被认为是分形过程,因为它可以应用于各种规模。 该过程可以小规模应用(例如单个程序),也可以大规模应用,直到企业级,那里有处理各个部分的庞大系统。
如果您想了解有关通用数据科学管道的更多信息,请查看数据科学文章,我们将在其中详细介绍。
一旦我们完成了ETL流程,我们就准备开始构建和训练我们的深度学习模型。 PyTorch具有一些内置的包和类,这些类和包使ETL过程非常容易。
PyTorch Imports
我们首先导入所有必需的PyTorch库。
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import torchvision
import torchvision.transforms as transforms
下表描述了每个软件包的:
包装 | 说明 |
---|---|
torch |
顶级PyTorch软件包和张量库。 |
torch.nn |
一个子包,其中包含用于构建神经网络的模块和可扩展类。 |
torch.optim |
一个子包,其中包含SGD和Adam之类的标准优化操作。 |
torch.nn.functional |
一个功能接口,其中包含用于构建神经网络的典型操作,例如损失函数和卷积。 |
torchvision |
一个软件包,提供对流行的数据集,模型体系结构和计算机视觉图像转换的访问。 |
torchvision.transforms |
一个接口,其中包含用于图像处理的常见转换。 |
Other Imports
接下来的导入是用于Python数据科学的标准软件包:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
#from plotcm import plot_confusion_matrix
import pdb
torch.set_printoptions(linewidth=120)
请注意,pdb
是Python调试器,注释的导入是本地文件,我们将在以后的文章中引入该文件来绘制混淆矩阵,最后一行设置PyTorch打印语句的打印选项。
我们现在准备准备我们的数据。
Preparing Our Data Using PyTorch
准备数据时,我们的最终目标是进行以下操作(ETL):
1.提取
–从源获取Fashion-MNIST图像数据。
2. 转换
–将我们的数据转换为张量形式。
3. 加载
–将我们的数据放入对象以使其易于访问。
为此,PyTorch为我们提供了两个类:
类 | 说明 |
---|---|
torch.utils.data.Dataset |
用于表示数据集的抽象类。 |
torch.utils.data.DataLoader |
包装数据集并提供对基础数据的访问。 |
抽象类是Python类,它具有必须实现的方法,因此我们可以通过创建扩展Dataset
类功能的子类来创建自定义数据集。
为了使用PyTorch创建自定义数据集,我们通过创建实现这些必需方法的子类来扩展Dataset类。完成此操作后,我们的新子类便可以传递给PyTorch DataLoader
对象。
我们将使用torchvision
软件包内置的fashion-MNIST
数据集,因此我们不必在项目中执行此操作。只需知道Fashion-MNIST
内置数据集类在后台进行此操作即可。
Dataset类
的所有子类都必须覆盖提供数据集大小的__len__
和支持从0到len(self)
互斥的整数索引的__getitem__
。
具体来说,有两种方法需要实现。 __len__
方法返回数据集的长度,而__getitem__
方法从数据集中获取位于数据集中特定索引位置的元素。
PyTorch Torchvision Package
torchvision软件包使我们可以访问以下资源:
数据集
(如MNIST和Fashion-MNIST)模型
(例如VGG16)Transforms
Utils
Computer Vision
所有这些资源都与深度学习计算机视觉任务有关。
当我们在上一篇文章中了解了Fashion-MNIST
数据集时,介绍了Fashion数据集的arXiv
论文表明,作者希望它成为原始MNIST数据集的替代品。
这样做的想法是使像PyTorch这样的框架可以通过仅更改用于检索数据的URL来添加Fashion-MNIST。
PyTorch就是这种情况。 PyTorch FashionMNIST数据集只是扩展了MNIST数据集并覆盖了网址。
这是PyTorch的torchvision源代码中的类定义:
class FashionMNIST(MNIST):
"""`Fashion-MNIST <https://github.com/zalandoresearch/fashion-mnist>`_ Dataset.
Args:
root (string): Root directory of dataset where ``processed/training.pt``
and ``processed/test.pt`` exist.
train (bool, optional): If True, creates dataset from ``training.pt``,
otherwise from ``test.pt``.
download (bool, optional): If true, downloads the dataset from the internet and
puts it in root directory. If dataset is already downloaded, it is not
downloaded again.
transform (callable, optional): A function/transform that takes in an PIL image
and returns a transformed version. E.g, ``transforms.RandomCrop``
target_transform (callable, optional): A function/transform that takes in the
target and transforms it.
"""
urls = [
'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz',
'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz',
'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz',
'http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz',
]
现在让我们看看如何利用torchvision
。
PyTorch Dataset Class
要使用torchvision
获取FashionMNIST数据集的实例,我们只需创建一个像这样的实例:
train_set = torchvision.datasets.FashionMNIST(
root='./data'
,train=True
,download=True
,transform=transforms.Compose([
transforms.ToTensor()
])
)
请注意,根参数以前是'./data/FashionMNIST'
,但是由于torchvision
更新而已更改。
我们指定以下参数:
参数 | 说明 |
---|---|
root |
数据在磁盘上的位置。 |
train |
如果数据集是训练集 |
download |
是否应下载数据。 |
transform |
应该对数据集元素执行的变换的组合。 |
由于我们希望将图像转换为张量,因此我们使用了内置的transforms.ToTensor()
转换,并且由于该数据集将用于训练,因此我们将其命名为train_set。
当我们第一次运行此代码时,Fashion-MNIST
数据集将在本地下载。后续呼叫将在下载数据之前检查数据。因此,我们不必担心重复下载或网络重复通话。
PyTorch DataLoader Class
要为我们的训练集创建一个DataLoader包装器,我们需要这样做:
train_loader = torch.utils.data.DataLoader(train_set
,batch_size=1000
,shuffle=True
)
我们只是将train_set
作为参数传递。 现在,我们可以利用加载程序来完成原本很难手动实现的任务:
batch_size
(在我们的示例中为1000)shuffle
(在我们的情况下为真)num_workers
(默认为0,表示将使用主进程)
ETL Summary
从ETL
的角度来看,我们在创建数据集时已经完成了提取,并使用了Torchvision
进行了转换:
提取
–从网络提取原始数据。变换
-原始图像数据被变换为张量。加载
-由数据加载器包装(加载到其中)的train_set使我们可以访问基础数据。
现在,我们应该对PyTorch提供的torchvision
模块有一个很好的了解,以及如何使用PyTorchtorch.utils.data
包中的Datasets
和DataLoader
来简化ETL任务。
在下一篇文章中,我们将了解如何与数据集和数据加载器一起使用,以访问和查看单个样本以及一批样本。
下一个再见!