Pytorch中的torchvision包中有一个名为ImageFolder的类,它能很好地为我们完成一切,只要我们的图像在一个适合的目录结构中,其中每一个目录分别是一个标签(例如,所有猫都在一个名为cat的目录中)。对于我们在对猫狗进行分类时,我们只需要以下代码:
import torchvision
from torchvision import transforms
train_data_path='"./train/"
transforms=transforms.Compose([
transforms.Resize(64),
transforms.ToTensor(),
transforms.Normalize(mean=[***],
std=[***])
train_data=torchvision.datasets.ImageFolder
(root=train_data_path,transform=transforms)
])
这里来分析一下以上代码的运算过程:
torchvision允许指定一个转换列表,将图像输入到神经网络之前可以应用这些变换。默认转换是将图像数据转换为一个张量(前面代码中的transforms.ToTensor()方法),另外还可以做一些可能看起来不太明显的工作。
首先,GPU非常擅长完成标准大小的计算。当然,我们也可能有各式各样的图像,往往有不同的分辨率。为了提高处理性能,我们通过Resize(64)转换把得到的每个图像缩放为相同的分辨率64x64。然后将图像转换为一个张量,最后根据一组特定的均值和标准差对张量归一化。
归一化很重要,因为输入通过神经网络层时会完成大量乘法;保证到来的值在0~1之间可以防止训练阶段中值变得过大[这称为梯度爆炸(exploding gradient)问题]。这里使用的时神奇参数是整个ImageNet的均值和标准差。可以专门计算这个鱼和猫子集的均值和标准差,不过ImageNet数据集这些值已经足够了(如果你要处理一个完全不同的数据集,就必须计算均值和标准差,不过很多人都是直接使用这些ImageNet常量,这样报告的结果也是可以接受的)
利用这些可组合的转换,我们可以很容易地完成图像的旋转和倾斜等操作来实现数据增强。
这里我们将图像分辨率调整为64x64.可选择的尺寸是多样的,常见的也有224x224或299x299的图像分辨率。一般来讲,输入尺寸越大,网络学习的数据就越多。但通常GPU内存中只能容纳很小批量的图像。
注:文章摘选自《基于Pytorch的深度学习》Ian Pointer著