使用Torchvision准备数据

与Keras一样,PyTorch通过torchvision提供了许多内置数据集和预训练模型。其中内置数据集保存在torchvision.datasets包中,预训练模型保存在torchvision.models中,读者可以在需要的时候自行查阅文档集成到代码中使用。

这里主要要介绍的是torchvision.transformstorchvision.utils两个包。先从utils包说起,这个包里只有两个函数make_grid()save_image(),分别用于将图片以表格形式排布和将图片保存到文件。

make_grid()主要接受以下参数:

  • tensor,接受一个4D张量或者有相同尺寸的图片列表。
  • nrow,设定每行显示多少张图片。
  • padding,图片间隔。
  • normalize,正则化,将图片像素的值转换到\( (0, 1) \)区间中。
  • range,整型元组,设定正则化的区间。

make_grid会返回一个张量,可以通过使用.numpy()将其转换为NumPy数组,交给Matpoltlib显示。相比make_grid()save_image()要多接受一个filename参数,用于将给定的张量保存到文件中。

transforms包主要提供的是图像变换功能。与Keras的ImageDataGenerator不同,PyTorch需要给定一系列的变换定义和组合,并自行进行应用。多个变换类实例可以通过transforms.Compose()组合在一起。transforms包中提供的变换操作主要有两种,一种是应用于PIL的Image实例,一种则是应用于张量。

以下变换类都是用于PIL Image实例的。

  • CenterCrop(size),从图片中央开始剪裁指定大小。
  • ColorJitter(brightness, contrast, satuation, hue),随机调整亮度、对比度、饱和度等。
  • FiveCrop(size),将图片四角和中央的五部分剪裁出来。
  • Grayscale(num_output_channels),将图片转换为灰度。
  • Pad(padding, fill, padding_mode),使用给定值在图片四周补白。
  • RandomAffine(degrees, translate, scale, shear, resample, fillcolor),对图片进行随机仿射变换。
  • RandomApply(transforms, p),对图片随机进行列表中的变换操作。
  • RandomChoice(transforms),对图片随机进行列表中定义的一种变换操作。
  • RandomCrop(size, padding, pad_if_need, fill, padding_mode),随机剪裁。
  • RandomGrayscale(p),按照几率随机进行灰度转换。
  • RandomHorizontalFlip(p),按照几率随机进行水平翻转。
  • RandomPerspective(distortion_scale, p, interpolation),随机进行透视变换。
  • RandomResizedCrop(size, scale, ratio, interpolation),随机进行缩放剪裁。
  • RandomRotation(degreeds, resample, expand, center),随机进行旋转。
  • RandomVerticalFlip(p),按照几率随机进行垂直翻转。
  • Resize(size, interpolation),缩放到指定尺寸。
  • Lambda(lambd),应用用户自定义变换。

transforms中用于张量的变换类只有两个,用于线性变换和正则化,读者可参考文档来使用。除此之外更加常用的是转换类,主要可以进行以下转换。

  • ToPILImage(mode),将张量或者NumPy数组转换为PIL Image实例,其中mode用于指定颜色空间。
  • ToTensor(),将PIL Image实例或者NumPy数组转换为张量。

以下给出一个使用PIL加载图片,进行随机仿射变换后转换为张量的示例。

image = PIL.Image.open(image_path)
affine_transform = transform.RandomAffine(60, 0, 1.5, 0)
t = transform.ToTensor()(affine_transform(image))