torchvision包

torchvision

  该包的主要功能是实现数据的处理,导入和预览等.如果需要对计算机视觉的相关问题进行处理,就可以借用torchvision包中提供的大量的类来完成相应的工作。torchvison包括下面四个部分。
  (1).torchvision.datasets:加载图片视频等数据集
  (2).torchvision.transforms:常见的图像转换工具,如随机裁剪、旋转等
  (3).torchvision.models:常见网络模型的定义,如Alexnet、VGG、Resnet以及它们的与训练模型
  (4).torchvision.utils:工具类,如保存张量(3 x h x w)作为图像到磁盘,给一个小批量创建一个图像网格等

1.torchvision.transforms

  torch.transform中提供了丰富的类对载入的数据进行变换。我们知道,在计算机视觉中,处理的数据大多是图片类型的,而在pytorch中实际处理的是tensor类型的变量。所以首先解决的是数据类型转换的问题,如果获取到的数据是格式或者大小不一的,则还需要进行归一化和大小缩放等操作。这时就需要torch.transorms。
对数据进行载入以及相应的变化的代码如下:

transform = transforms.Compose([transforms.CenterCrop(224),
                                transforms.ToTensor(),
                                transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])

这里我们可以将torchvision.transforms.Compose类看成一种容器,它能同时对多种数据变换进行组合操作。
在上面的代码中,用了一个类型转换,一个标准化变换和一个大小裁剪变换。
下面是torchvision.transform中常用的数据变换:
1.ToTensor(): 是把图片数据转换成tensor并转化范围在[0,1]。
2.ToPILImage() :是将 shape 为 (C, H, W) 的 Tensor 或者 shape 为 (H, W, C) 的 numpy.ndarray 转换成 PIL.Image,值不变。

3.Normalize(mean,std):是归一化的方法,mean = (R, G, B),std = (R, G, B),如[0.485, 0.456, 0.406]和[0.229, 0.224, 0.225],

4.Resize(size):是将输入的PIL图像调整为给定的大小。参数可以int,也可以是int的元组(h,w),

5.CenterCrop(size):是将给定的 PIL.Image 进行中心切割,得到给定的 size,size 可以是 tuple,(target_height, target_width)。size 也可以是一个 Integer,在这种情况下,切出来的图片形状是正方形。

6.RandomCrop(size, padding=0):也是切割,不过切割中心点的位置随机选取。size 可以是 tuple 也可以是 Integer。

7.RandomHorizontalFlip(size, interpolation=2):是先将给定的 PIL.Image 随机切,然后再 resize 成给定的 size 大小。

8.RandomHorizontalFlip():是随机水平翻转给定的 PIL.Image,概率为 0.5。

9.RandomVerticalFlip():是随机垂直翻转给定的 PIL.Image,概率为 0.5。
10.FiveCrop(size):是将给定的PIL图像剪裁成四个角落区域和中心区域。

11.Pad(padding, fill=0, padding_mode=‘constant’):是对给定的PIL图像的边缘进行填充,填充的数值为给定填充数值。

2. torchvision.datasets

  是继承torch.utils.data.Dataset的子类。datasets下面有个datasets.ImageFolder的方法可以实现数据导入。

ImageFolder(root,transform=None,target_transform=None,loader=default_loader)

root :用于指定数据集在下载之后的存放路径。
transform:用于指定导入数据集时需要对数据集进行哪种变换操作。这里注意,需要提前定义这些变换操作。
target_transform :对label进行变换
loader: 指定加载图片的函数,默认操作是读取PIL image对象

3.torch.utils.data

  有两个很重要的组件data.Dataset和data.Dataloader。
  data.Dataset是一个抽象类,在pytorch中所有与数据相关的类都要继承这个类来实现,之前的datasets.ImageFolder和这里的data.Dataloader也是继承它的
  前面的datasets.ImageFolder只是返回一个list,而在pytorch中list是不能作为模型输入的,所以需要data.Dataloader 将list数据封装为tensor数据格式,以备模型使用。分别将图像和标签分别封装为一个tensor
如下:

path = "data"
transform = transforms.Compose([transforms.CenterCrop(224),
                                transforms.ToTensor(),
                                transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])])

data_image = {x: datasets.ImageFolder(root=os.path.join(path, x),
                                      transform=transform)
              for x in ["train", "val"]}

data_loader_image = {x: torch.utils.data.DataLoader(dataset=data_image[x],
                                                    batch_size=4,
                                                    shuffle=True)
                     for x in ["train", "val"]}

这里data_loader_image就是一个Variable数据类型的,可以作为模型的输入了。

4.torchvision.models

  torchvison.models这个包中包含了alexnet,densenet,inception,resnet,squeezenet,vgg等常用的网络结构,并且提供了预训练模型,可以通过简单调用来读取网络结构和预训练模型。
  
例如,有下列常用模型和预训练版本:
(1)AlexNet: AlexNet variant from the “One weird trick” paper.
(2)VGG: VGG-11, VGG-13, VGG-16, VGG-19 (with and without batch normalization)
(3)ResNet: ResNet-18, ResNet-34, ResNet-50, ResNet-101, ResNet-152
(4)SqueezeNet: SqueezeNet 1.0, and SqueezeNet 1.1
如何构建和下载?

import torchvision.models as models

resnet18 = models.resnet18(pretrained=True)
vgg16 = models.vgg16(pretrained=True)
alexnet = models.alexnet(pretrained=True)
squeezenet = models.squeezenet1_0(pretrained=True)

  预训练模型可以通过pretrained=True来构建。如果只需要网络结构,不需要用训练模型的参数来初始化,可以将pretrained设置为False。
如下:

import torchvision.models as models
vgg19 = models.vgg19(pretrained = True)#获取训练好的vgg19模型
pretrained_dict = vgg19.state_dict()#返回包含模块所有状态的字典,包括参数和缓存
print(vgg19)
print(pretrained_dict)

你可能感兴趣的:(pytorch,基础)