pytorch——torchvision预训练模型与数据集全览

2022-10-22 10:05:21

torchvision预训练模型与数据集全览

torchvision

官网介绍: The torchvision package consists of popular datasets, model architectures, and common image transformations for computer vision.(torchvision包由流行的数据集、模型体系结构和通用的计算机视觉图像转换组成。简单地说就是常用数据集+常见模型+常见图像增强方法
这个torchvision中主要包含的包:

  • torchvision.datasets
  • torchvision.models
  • torchvision.transforms

torchvision.datssets

包含的数据集:
在这里插入图片描述
官方说明了:All the datasets have almost similar API. They all have two common arguments: transform and target_transform to transform the input and target respectively.(每一个数据集的API都是基本相同的。他们都有两个相同的参数:transform和target_transform(后面细讲)

我们就用最经典最简单的MNIST手写数字数据集作为例子,先看这个的API:
在这里插入图片描述
包含5个参数:

  • root:就是你想要保存MNIST数据集的位置,如果download是Flase的话,则会从目标位置读取数据集;
  • download:True的话就会自动从网上下载这个数据集,到root的位置;
  • train:True的话,数据集下载的是训练数据集;False的话则下载测试数据集(真方便,都不用自己划分了)
  • transform:这个是对图像进行处理的transform,比方说旋转平移缩放,输入的是PIL格式的图像(不是tensor矩阵)
  • target_transform:这个是对图像标签进行处理的函数(这个我没用过不太确定,也许是做标签平滑那种的处理?)

【下面用代码进一步理解】

import torchvision
mydataset= torchvision.datasets.MNIST(root='./',
                                      train=True,
                                      transform=None,
                                      target_transform=None,
                                      download=True)

运行结果:
在这里插入图片描述
在这里插入图片描述
之后我们需要用到上一节课讲到的dataloader的内容:

from torch.utils.dataimport Dataset,DataLoader
myloader= DataLoader(dataset=mydataset,
                     batch_size=16)for i,(data,label)inenumerate(myloader):print(data.shape)print(label.shape)break

这时会抛出一个错误:
在这里插入图片描述
大致看一看,就是pytorch的这个dataloader不是可以把数据集分成batch嘛,这个dataloder只能把tensor或者numpy这样的组合成batch,而现在的数据集的格式是PIL格式。这里验证了之前说到的,transform这个输入是PIL格式的图片,解决方法是:transform不能是None,我们需要将PIL转化成tensor才可以
所以我们把上面的transform稍作修改:

在这里插入代码片mydataset= torchvision.datasets.MNIST(root='./',
                                      train=True,        
                                      transform=torchvision.transforms.ToTensor(),
                                      target_transform=None,
                                      download=True)

运行结果:
在这里插入图片描述
结果中,16表示一个batch有16个样本,1表示这是单通道的灰度图片,28表示MNIST数据集图片是的大小,然后每一个图片有一个label。
想要获取其他的数据集也是一样的,不过这里就用MNIST作为举例,其他的相同。

torchvision.models

预训练模型中torchvision提供了很多种,大体分成下面四类:
在这里插入图片描述
分别是分类模型,语义模型,目标检测模型和视频分类模型。这里呢因为分类模型比较常见也比较基础,就主要介绍这个好啦。
在torch1.6.0版本中(应该是比较近的版本),主要包含下面的预训练模型:
在这里插入图片描述
构建模型可以通过下面的代码:

import torchvision.modelsas models
resnet18= models.resnet18()
alexnet= models.alexnet()
vgg16= models.vgg16()
squeezenet= models.squeezenet1_0()
densenet= models.densenet161()
inception= models.inception_v3()
googlenet= models.googlenet()
shufflenet= models.shufflenet_v2_x1_0()
mobilenet= models.mobilenet_v2()
resnext50_32x4d= models.resnext50_32x4d()
wide_resnet50_2= models.wide_resnet50_2()
mnasnet= models.mnasnet1_0()

这样构建的模型的权重值是随机的,只有结构是保存的。想要获取预训练的模型,则需要设置参数pretrained:

import torchvision.modelsas models
resnet18= models.resnet18(pretrained=True)
alexnet= models.alexnet(pretrained=True)
squeezenet= models.squeezenet1_0(pretrained=True)
vgg16= models.vgg16(pretrained=True)
densenet= models.densenet161(pretrained=True)
inception= models.inception_v3(pretrained=True)
googlenet= models.googlenet(pretrained=True)
shufflenet= models.shufflenet_v2_x1_0(pretrained=True)
mobilenet= models.mobilenet_v2(pretrained=True)
resnext50_32x4d= models.resnext50_32x4d(pretrained=True)
wide_resnet50_2= models.wide_resnet50_2(pretrained=True)
mnasnet= models.mnasnet1_0(pretrained=True)

似乎这些模型的预训练数据集都是ImageNet的那个数据集,输入图片都是3通道的,并且要求输入图片的宽高不小于224像素,并且要求输入图片像素值的范围在0到1之间,然后做一个normalization标准化。
不知道各位在看一些案例的时候,有没有看到这个标准化:mean = [0.485, 0.456, 0.406] 和 std = [0.229, 0.224, 0.225],这个应该是ImageNet的图片的标准化的参数。

模型比较

最后呢,torchvision官方提供了一个不同模型在Imagenet 1-crop 的一个错误率的比较。可以一起来看看到底哪个模型比较好使。这里我放了一些常见的模型。像是Wide ResNet这种变种我就不放了。
在这里插入图片描述

整体来看,还是Resnet残差网络效果好。不过EfficientNet效果更好。

  • 作者:chris_1996
  • 原文链接:https://blog.csdn.net/weixin_45833008/article/details/108652129
    更新时间:2022-10-22 10:05:21