使用Torchvision准备数据
与Keras一样,PyTorch通过torchvision
提供了许多内置数据集和预训练模型。其中内置数据集保存在torchvision.datasets
包中,预训练模型保存在torchvision.models
中,读者可以在需要的时候自行查阅文档集成到代码中使用。
这里主要要介绍的是torchvision.transforms
和torchvision.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))