[Pytorch系列-37]: 工具集 - torchvision库详解(数据集数据预处理模型)
Posted 文火冰糖的硅基工坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Pytorch系列-37]: 工具集 - torchvision库详解(数据集数据预处理模型)相关的知识,希望对你有一定的参考价值。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/121149809
目录
第5章 torchvision.transforms 图形预处理简介
5.3 预处理的组合:torchvision.transforms
第1章 Pytorch常见的工具集简介
Pytorch提供了很多预先编写好的、针对特定应用领域的工具工具集。方便使用者快速建立网络。
(1)官方主页
https://pytorch.org/docs/stable/index.html
(2)工具集
- torchaudio #语音处理工具集
- torchtext #文本处理工具集
- torchvision #图像处理工具集
- TorchServe # 一款用于机器学习模型部署和调用的微服务程序
- PyTorch on XLA Devices
第2章 Pytorch的torchvision工具集简介
(1)官方主页
torchvision — Torchvision 0.11.0 documentation
(2)简介
torchvision是独立于pytorch的关于图像操作的一些方便工具库。
其包含一些常用的数据集、模型、转换函数等等。
torchvision.datasets : 几个常用视觉数据集,可以在线下载和离线加载。
torchvision.models : 流行的模型,例如 AlexNet, VGG, ResNet 和 Densenet 以及 与训练好的参数。
torchvision.transforms : 常用的图像操作,例如:随机切割,旋转,数据类型转换,图像到tensor ,numpy 数组到tensor , tensor 到 图像等。
torchvision.utils : 提供了一组与视频处理相关的函数。
(3)上述工具的关系
第3章 torchvision.datasets 简介
3.1 简介
torchvision.datasets — Torchvision 0.11.0 documentationhttps://pytorch.org/vision/stable/datasets.htmltorchvision.datasets提供了对常见数据集的基本操作。
(1)特定数据集的远程下载和文件读取
例如:
imagenet_data = torchvision.datasets.ImageNet(root='path/to/imagenet_root/')
- 不同的数据集,其远程下载和文件读取的函数相似
- 不同的数据集,其远程下载和文件读取的函数参数不同
- 并非所有数据集都支持远程下载,有时候需要手工下载到本地,然后通过本地文件读取。
(3)本地数据集文件的读取(从文件系统加载到内存对象)
train_data = ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
(3)数据集的批量加载:data_loader
data_loader = torch.utils.data.DataLoader(imagenet_data,
batch_size=4,
shuffle=True,
num_workers=args.nThreads)
3.2 支持的数据集列表
- Caltech
- CelebA
- CIFAR
- Cityscapes
- COCO
- EMNIST
- FakeData
- Fashion-MNIST
- Flickr
- HMDB51
- ImageNet
- iNaturalist
- Kinetics-400
- KITTI
- KMNIST
- LFW
- LSUN
- MNIST
- Omniglot
- PhotoTour
- Places365
- QMNIST
- SBD
- SBU
- SEMEION
- STL10
- SVHN
- UCF101
- USPS
- VOC
- WIDERFace
- Base classes for custom datasets
第4章 torchvision.models简介
4.1 简介
torchvision.models — Torchvision 0.11.0 documentationhttps://pytorch.org/vision/stable/models.html
4.2 支持的模型
-
Inception v3
-
ShuffleNet v2
4.3 构造具有随机权重的模型
(1)概述
你可以通过调用其构造函数来构造具有随机权重的模型。
有了torchvision.models,程序员就不需要自己一层一层地、手工、搭建知名的神经网络,models已经搭建好这些网络模型,程序员直接利用models提供的函数,创建对应的模型对象。
(2)代码示例
import torchvision.models as models
alexnet = models.alexnet() # AlexNet
vgg16 = models.vgg16() # VGG16
resnet18 = models.resnet18() # ResetNet模型
googlenet = models.googlenet() # googlenet
inception = models.inception_v3() # inception
squeezenet = models.squeezenet1_0() # 序列网络
densenet = models.densenet161() # 稠密网络
shufflenet = models.shufflenet_v2_x1_0()
mobilenet_v2 = models.mobilenet_v2()
mobilenet_v3_large = models.mobilenet_v3_large()
mobilenet_v3_small = models.mobilenet_v3_small()
resnext50_32x4d = models.resnext50_32x4d()
wide_resnet50_2 = models.wide_resnet50_2()
mnasnet = models.mnasnet1_0()
#efficientnet_b0 = models.efficientnet_b0()
#efficientnet_b1 = models.efficientnet_b1()
#efficientnet_b2 = models.efficientnet_b2()
#efficientnet_b3 = models.efficientnet_b3()
#efficientnet_b4 = models.efficientnet_b4()
#efficientnet_b5 = models.efficientnet_b5()
#efficientnet_b6 = models.efficientnet_b6()
#efficientnet_b7 = models.efficientnet_b7()
#regnet_y_400mf = models.regnet_y_400mf()
#regnet_y_800mf = models.regnet_y_800mf()
#regnet_y_1_6gf = models.regnet_y_1_6gf()
#regnet_y_3_2gf = models.regnet_y_3_2gf()
#regnet_y_8gf = models.regnet_y_8gf()
#regnet_y_16gf = models.regnet_y_16gf()
#regnet_y_32gf = models.regnet_y_32gf()
#regnet_x_400mf = models.regnet_x_400mf()
#regnet_x_800mf = models.regnet_x_800mf()
#regnet_x_1_6gf = models.regnet_x_1_6gf()
#regnet_x_3_2gf = models.regnet_x_3_2gf()
#regnet_x_8gf = models.regnet_x_8gf()
#regnet_x_16gf = models.regnet_x_16gf()
#regnet_x_32gf = models.regnet_x_32gf()
(4)模型显示
print(alexnet)
AlexNet( (features): Sequential( (0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2)) (1): ReLU(inplace=True) (2): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False) (3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)) (4): ReLU(inplace=True) (5): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False) (6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (7): ReLU(inplace=True) (8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (9): ReLU(inplace=True) (10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (11): ReLU(inplace=True) (12): MaxPool2d(kernel_size=3, stride=2, padding=0, dilation=1, ceil_mode=False) ) (avgpool): AdaptiveAvgPool2d(output_size=(6, 6)) (classifier): Sequential( (0): Dropout(p=0.5, inplace=False) (1): Linear(in_features=9216, out_features=4096, bias=True) (2): ReLU(inplace=True) (3): Dropout(p=0.5, inplace=False) (4): Linear(in_features=4096, out_features=4096, bias=True) (5): ReLU(inplace=True) (6): Linear(in_features=4096, out_features=1000, bias=True) ) )
print(vgg16)
VGG( (features): Sequential( (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace=True) (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU(inplace=True) (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (6): ReLU(inplace=True) (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (8): ReLU(inplace=True) (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (11): ReLU(inplace=True) (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (13): ReLU(inplace=True) (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (15): ReLU(inplace=True) (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (18): ReLU(inplace=True) (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (20): ReLU(inplace=True) (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (22): ReLU(inplace=True) (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (25): ReLU(inplace=True) (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (27): ReLU(inplace=True) (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (29): ReLU(inplace=True) (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (avgpool): AdaptiveAvgPool2d(output_size=(7, 7)) (classifier): Sequential( (0): Linear(in_features=25088, out_features=4096, bias=True) (1): ReLU(inplace=True) (2): Dropout(p=0.5, inplace=False) (3): Linear(in_features=4096, out_features=4096, bias=True) (4): ReLU(inplace=True) (5): Dropout(p=0.5, inplace=False) (6): Linear(in_features=4096, out_features=1000, bias=True) ) )
4.4 使用预预训练好的模型
(1)概述
我们可以使用 PyTorch 提供的预训练好的模型,通过简单的传递参数给构造函数即可:pretrained=True, 如下所示:
当指定了pretrained=True时,构造函数会自动从远程下载预先训练好的模型,即模型的权重值。
每个训练好模型的下载时间与模型权重的大小有关。
预训练好的模型,是由PyTorch torch.utils.model_zoo (模型公园)提供的。
(2)下载模型的存放目录
下载的模型,存放到本机cache目录中,如:C:\\Users\\Administrator/.cache\\torch\\hub\\checkpoints\\alexnet-owt-4df8aa71.pth
也可以通过环境变量:TORCH_MODEL_ZOO指定存放模型的根目录。
详细参考:. torch.utils.model_zoo.load_url()
(3)代码示例
import torchvision.models as models
vgg16 = models.vgg16(pretrained=True)
Downloading: "https://download.pytorch.org/models/vgg16-397923af.pth" to C:\\Users\\Administrator/.cache\\torch\\hub\\checkpoints\\vgg16-397923af.pth 0.1%
(4)部分预训练模型默认的下载地址(从代码中提取)
#Alexnet:
model_urls = {
'alexnet': 'https://download.pytorch.org/models/alexnet-owt-4df8aa71.pth',
}
#vggnet:
model_urls = {
'vgg11': 'https://download.pytorch.org/models/vgg11-bbd30ac9.pth',
'vgg13': 'https://download.pytorch.org/models/vgg13-c768596a.pth',
'vgg16': 'https://download.pytorch.org/models/vgg16-397923af.pth',
'vgg19': 'https://download.pytorch.org/models/vgg19-dcbb9e9d.pth',
'vgg11_bn': 'https://download.pytorch.org/models/vgg11_bn-6002323d.pth',
'vgg13_bn': 'https://download.pytorch.org/models/vgg13_bn-abd245e5.pth',
'vgg16_bn': 'https://download.pytorch.org/models/vgg16_bn-6c64b313.pth',
'vgg19_bn': 'https://download.pytorch.org/models/vgg19_bn-c79401a0.pth',
}
#Resnet:
model_urls = {
'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth',
'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth',
'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth',
'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth',
'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth',
}
#inception:
model_urls = {
# Inception v3 ported from TensorFlow
'inception_v3_google': 'https://download.pytorch.org/models/inception_v3_google-1a9a5a14.pth',
}
#Densenet:
model_urls = {
'densenet121': 'https://download.pytorch.org/models/densenet121-a639ec97.pth',
'densenet169': 'https://download.pytorch.org/models/densenet169-b2777c0a.pth',
'densenet201': 'https://download.pytorch.org/models/densenet201-c1103571.pth',
'densenet161': 'https://download.pytorch.org/models/densenet161-8d451a50.pth',
}
通过这些地址,程序员可以手工下载。
第5章 torchvision.transforms 图形预处理简介
5.1 简介
torchvision.transforms — Torchvision 0.11.0 documentation
torchvision.transforms是pytorch中的图像预处理包,包含了很多种对图像数据进行变换的函数,这些都是在我们进行图像数据读入步骤中必不可少的。
5.2 常见的预处理
-
torchvision.transforms.Normalize(mean, std):
用给定的均值和标准差分别对每个通道的数据进行正则化。
具体来说,给定均值(M1,…,Mn),给定标准差(S1,…,Sn),其中n是通道数(一般是3),对每个通道进行如下操作:
output[channel] = (input[channel] - mean[channel]) / std[channel]
比如:原来的tensor是三个维度的,值在[0,1]之间,经过变换之后就到了[-1,1]
计算如下:((0,1)-0.5)/0.5=(-1,1)
-
torchvision.transforms.ToTensor :
把一个取值范围是[0,255]的PIL.Image或者shape为(H,W,C)的numpy.ndarray,转换成形状为[C,H,W],取值范围是[0,1.0]的torch.FloadTensor
-
torchvision.transforms.ToPILImage:
将shape为(C,H,W)的Tensor或shape为(H,W,C)的numpy.ndarray转换成PIL.Image,值不变。
PIL(Python Image Library)是PythonWare公司提供了免费的图像处理工具包。
该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。
在PIL中,任何一副图像都是用一个Image对象(不是Pytorch Tensor)表示,而这个类由和它同名的模块导出,因此,要加载一副图像,最简单的形式是这样的:
import Image
img = Image.open(“dip.jpg”)
-
torchvision.transforms.CenterCrop(size)
将给定的PIL.Image进行中心切割,得到给定的size,size可以是tuple,(target_height, target_width)。size也可以是一个Integer,在这种情况下,切出来的图片的形状是正方形。
-
torchvision.transforms.RandomCrop(size, padding=0)
切割中心点的位置随机选取。size可以是tuple也可以是Integer。
-
torchvision.transforms.RandomHorizontalFlip
随机水平翻转给定的PIL.Image,概率为0.5。即:一半的概率翻转,一半的概率不翻转。
-
torchvision.transforms.RandomSizedCrop(size, interpolation=2)
先将给定的PIL.Image随机切,然后再resize成给定的size大小。
-
torchvision.transforms.Pad(padding, fill=0)
将给定的PIL.Image的所有边用给定的pad value填充。 padding:要填充多少像素 fill:用什么值填充
-
其他
5.3 预处理的组合:torchvision.transforms
大多数,我们需要多图片进行多种预处理,这时候就需要用到torchvision.transforms。
torchvision.transforms是pytorch中的图像预处理包,可以把多种对图像数据进行变换的函数进行串联起来,这在我们进行图像数据读入步骤中,一个非常有用的工具。
data_transforms = transforms.Compose([
transforms.RandomResizedCrop(224), # 调整尺寸, 或增加或裁剪
transforms.RandomHorizontalFlip(), # 翻转
transforms.ToTensor(), # 转换成tensor
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) #正则化
])
ransforms.Compose(transforms) 方法是将多种变换组合在一起。
上述对data_transforms进行了五种变换:
- 先对其进行随机大小和随机宽高比的裁剪,
- 之后resize到指定大小224,
- 以及对原始图像进行随机的水平翻转;
- 转换成pytorch的Tensor
- 正则化
第6章 torchvision.utils简介
6.1 概述
torchvision.utils — Torchvision 0.11.0 documentation
torchvision.utils提供了大量的对图像数据的处理工具,包括制作图像网格、图像保存以及图像外框绘制等。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/121149809
以上是关于[Pytorch系列-37]: 工具集 - torchvision库详解(数据集数据预处理模型)的主要内容,如果未能解决你的问题,请参考以下文章
[Pytorch系列-43]:工具集 - torchvision预训练模型参数的导入(以ResNet为例)
[Pytorch系列-47]:工具集 - torchvision.transforms.Normalize和ToSensor的深入详解
[Pytorch系列-39]:工具集 - torchvision搭建AlexNet/VGG/Resnet等网络并训练CFAR10分类数据
[Pytorch系列-70]:开发环境 - 可视化工具visdom安装与使用方法
[Pytorch系列-38]: 工具集 - torchvision预定义模型的两种模式model.train和model.eval的表面和本质区别