您的位置:

深入了解 PyTorch Transforms

PyTorch 是目前深度学习领域最流行的框架之一。其提供了丰富的功能和灵活性,使其成为科学家和开发人员的首选选择。在 PyTorch 中,transforms 是用于转换图像和数据的重要组件之一。transforms 模块提供了各种常用的图像变换方法,既可以应用于训练数据集的标注,也可以应用于模型的输入数据。本文将从多个方面详细阐述 transforms 模块,旨在让读者更深入理解 PyTorch 中的 transforms 模块。

一、预处理

在 PyTorch 中,图像预处理是模型训练中非常重要的一环,transforms 模块提供了多种处理方式。使用 transforms.Compose 方法,可以将多种变换组合在一起,并且按照给定的顺序依次应用。

下面是一个简单的示例代码:

import torch
from torchvision import transforms
from PIL import Image

transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

img = Image.open('image.jpg')
img_t = transform(img)

这个例子中,我们首先定义了一个 Compose 变换,其中包括了四个变换,分别是:

  • Resize:将图片调整为给定尺寸。
  • CenterCrop:将图片按中心进行剪裁。
  • ToTensor:将 PIL 图片转换为 PyTorch Tensor。
  • Normalize:对 Tensor 进行标准化,使其具有零均值和单位方差。

在变换后,我们使用 PIL 库打开一张 jpeg 格式的图片,并应用定义好的变换。最终,我们得到了一个经过预处理的 Tensor。

二、数据增强

在深度学习任务中,数据增强是一个非常重要的方法,目的是通过对原始数据进行变换,扩充训练集的规模,增加模型的鲁棒性。transforms 模块提供了多种用于数据增强的变换,在 PyTorch 中非常容易使用。

下面是一个包括 RandomCrop、RandomHorizontalFlip 和 ColorJitter 的数据增强示例:

transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4, hue=0.1),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

在这个例子中,我们使用了 RandomResizedCrop 可以对图片进行随机大小裁剪,RandomHorizontalFlip 可以随机翻转图片。另外,ColorJitter 可以进行随机颜色调整。

三、自定义变换

在 PyTorch 中,我们可以自定义一些数据变换类,来满足特定的需求。为了创建一个自定义的变换类,我们需要继承 torchvision.transforms 中的 Transform 类,并实现 __call__ 方法。__call__ 函数需要接受一个 PIL 图像,并返回预处理后的图像。下面是一个将图片进行镜像翻转的自定义变换:

class Mirror(object):
    def __call__(self, img):
        return img.transpose(method=Image.FLIP_LEFT_RIGHT)

transform = transforms.Compose([
    transforms.Resize(256),
    Mirror(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

在这个例子中,我们定义了一个 Mirror 变换,它继承了 Transform 类,并在 __call__ 方法中实现了镜像翻转操作。在 Compose 中使用 Mirror 变换可以让图片在水平方向上进行翻转。

四、应用于 Torchvision 库

PyTorch 的 Torchvision 库是一个用于计算机视觉任务的常用库。Torchvision 提供了许多常用的数据集和模型,同时也提供了一些常用的 transforms 变换,可以用于数据集的预处理和数据增强。为了使用 Torchvision 中的 transforms,我们可以直接在 torchvision.transforms 中导入对应的变换。

下面是一个使用 Torchvision 库的示例:

import torchvision.transforms as transforms

train_transforms = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

val_transforms = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

在这个例子中,我们定义了两个用于训练集和验证集的 transforms。对于训练集,我们使用了 RandomResizedCrop 和 RandomHorizontalFlip 来进行数据增强;对于验证集,我们使用了 CenterCrop 来进行预处理。

总结

本文详细介绍了 PyTorch 中的 transforms 模块。transforms 提供了用于预处理和数据增强的常见变换和自定义变换。除了可以应用于 PyTorch 训练数据集的标注之外,transforms 可以应用于模型的输入数据以及 Torchvision 库中的数据集。