2.2 图片预处理 transforms 模块机制

PyTorch 的数据增强

我们在安装PyTorch时,还安装了torchvision,这是一个计算机视觉工具包。有 3 个主要的模块:

  • torchvision.transforms: 里面包括常用的图像预处理方法

  • torchvision.datasets: 里面包括常用数据集如 mnist、CIFAR-10、Image-Net 等

  • torchvision.models: 里面包括常用的预训练好的模型,如 AlexNet、VGG、ResNet、GoogleNet 等

深度学习模型是由数据驱动的,数据的数量和分布对模型训练的结果起到决定性作用。所以我们需要对数据进行预处理和数据增强。下面是用数据增强,从一张图片经过各种变换生成 64 张图片,增加了数据的多样性,这可以提高模型的泛化能力。

常用的图像预处理方法有:

  • 数据中心化

  • 数据标准化

  • 缩放

  • 裁剪

  • 旋转

  • 翻转

  • 填充

  • 噪声添加

  • 灰度变换

  • 线性变换

  • 仿射变换

  • 亮度、饱和度以及对比度变换。

人民币图片二分类实验中,我们对数据进行了一定的增强。

当我们需要多个transforms操作时,需要作为一个list放在transforms.Compose中。需要注意的是transforms.ToTensor()是把图片转换为张量,同时进行归一化操作,把每个通道 0255 的值归一化为 01。在验证集的数据增强中,不再需要transforms.RandomCrop()操作。然后把这两个transform操作作为参数传给Dataset,在Dataset__getitem__()方法中做图像增强。

其中self.transform(img)会调用Compose__call__()函数:

可以看到,这里是遍历transforms中的函数,按顺序应用到 img 中。

transforms.Normalize

功能:逐 channel 地对图像进行标准化

output = ( input - mean ) / std

  • mean: 各通道的均值

  • std: 各通道的标准差

  • inplace: 是否原地操作

该方法调用的是F.normalize(tensor, self.mean, self.std, self.inplace)

而```F.normalize()``方法如下:

首先判断是否为 tensor,如果不是 tensor 则抛出异常。然后根据inplace是否为 true 进行 clone,接着把mean 和 std 都转换为tensor (原本是 list),最后减去均值除以方差:tensor.sub_(mean[:, None, None]).div_(std[:, None, None])

对数据进行均值为 0,标准差为 1 的标准化,可以加快模型的收敛。

逻辑回归的实验中,我们的数据生成代码如下:

生成的数据均值是mean_value+bias=1.7+1=2.7,比较靠近 0 均值。模型在 380 次迭代时,准确率就超过了 99.5%。

如果我们把 bias 修改为 5。那么数据的均值变成了 6.7,偏离 0 均值较远,这时模型训练需要更多次才能收敛 (准确率达到 99.5%)。

参考资料

如果你觉得这篇文章对你有帮助,不妨点个赞,让我有更多动力写出好文章。

我的文章会首发在公众号上,欢迎扫码关注我的公众号张贤同学

最后更新于

这有帮助吗?