常见的Transformers

192 阅读4分钟

关注点

image.png

一、常见的 transforms 操作

  1. ToTensor

    • 功能: 将来自 PIL 图像或 numpy 数组的数据转换为 PyTorch 张量,同时将像素值从 0-255 归一化到 0-1。
    • 用途: 使图像数据以张量格式输入神经网络。
  2. Normalize

    • 功能: 对张量图像进行标准化处理,将每个通道的数据调整为均值为零、标准差为一。
    • 用途: 提高模型的稳定性和训练效果,减轻输入数据的幅度变化。
  3. Resize

    • 功能: 将图像调整为指定尺寸。
    • 用途: 确保输入的图像都具有统一的大小。
  4. RandomCrop

    • 功能: 随机裁剪图像到指定尺寸。
    • 用途: 用于数据增强,可以在模型训练时提供多样化的输入视图。
  5. RandomHorizontalFlip

    • 功能: 随机水平翻转图像。
    • 用途: 提高模型对于不同视图和变换的鲁棒性。
  6. Compose

    • 功能: 将多个变换组合成一个整体。
    • 用途: 方便将一系列预处理操作应用到每个输入样本。

举个例子

假设有一个图像数据集,准备进行训练。可以用 transforms 来规范化数据:

import torchvision.transforms as transforms

# 定义一个变换序列
transform = transforms.Compose([
    transforms.Resize((128, 128)),  # 调整图像大小
    transforms.ToTensor(),          # 转换为张量
    transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]) # 标准化每个通道
])
# 应用在数据集加载器中
# 通过这个变换序列,每个图像都将被缩放到 128x128 像素,
# 转换为张量格式,并进行标准化处理,以提高模型训练效率。

二、具体使用

1、Normalize

这段代码使用 PyTorch 和 Tensorboard 的功能来进行图像的处理和可视化。

  1. 导入库

    from torch.utils.tensorboard import SummaryWriter
    from torchvision import transforms
    from PIL import Image
    import cv2
    
    • torch.utils.tensorboard.SummaryWriter:用于记录和可视化数据,便于了解模型训练过程或者数据变换效果。
    • torchvision.transforms:提供了用于图像预处理的变换,例如 ToTensorNormalize
    • PIL.Image:用于读写图像文件。
    • cv2:OpenCV库,这里虽然导入了,但并没有在代码中使用它。
  2. 读取图像

    img_path = "pytorchstu/data/train/ants_image/0013035.jpg"
    img = Image.open(img_path)
    
    • 用 PIL 打开指定路径的图片,得到一个 img 对象,这是一个 PIL 图像。
  3. 初始化 Tensorboard

    writer = SummaryWriter("logs")
    
    • 创建一个 SummaryWriter 实例,将会写日志到 logs 文件夹。
  4. 图像转换为张量

    tensor_trans = transforms.ToTensor()
    img_tensor = tensor_trans(img)
    print(img_tensor[0][0][0])
    
    • transforms.ToTensor() 将图像从 PIL 格式转换为 PyTorch 张量格式。这个转换通常将像素值从 [0, 255] 归一化到 [0, 1](实现方法为除以255)。
    • img_tensor 是图像的张量表示。
    • print(img_tensor[0][0][0]) 是输出图像张量的一个像素点的值,具体是该像素点在红色通道上的值。这是因为张量的格式通常是 [C, H, W](通道、行、列),所以 [0][0][0] 访问的是第一个通道、第一个像素行、第一个像素列的值。
  5. 标准化

    tensor_norm = transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
    img_norm = tensor_norm(img_tensor)
    print(img_norm[0][0][0])
    
    • transforms.Normalize 通过减去均值并除以标准差来标准化每个通道,公式是 (input[channel] - mean[channel]) / std[channel]
    • 这里的均值和标准差都是 [0.5, 0.5, 0.5],这会将图像张量值调整到 [-1, 1] 的范围。
    • print(img_norm[0][0][0]) 输出经过标准化处理后的第一个位置的值。这是标准化之后的同一个像素的值。
    • 因为使用的均值和标准差都是 0.5,所以计算该像素点新的值为:(原始值 - 0.5) / 0.5, 这会将值映射到 [-1, 1] 的范围
    • 虽然 ToTensor() 将像素值映射到了 [0, 1] 的范围,但图像数据的分布可能没有零均值和单位方差。Normalize 则是进一步调整数据,使数据的均值为零、标准差为一,符合标准机器学习假设。
    • Normalize 过程帮助中心化数据,使每个通道的数据平衡,提高模型的收敛性和泛化能力。
  6. 可视化张量

    writer.add_image("img_tensor", img_tensor)
    writer.add_image("img_norm", img_norm)
    writer.close()
    
    • 使用 add_image 将图像张量和标准化后的图像写入 Tensorboard。
    • 关闭 SummaryWriter,确保所有数据正确写入。

可视化

通过执行代码并启动 Tensorboard:tensorboard --logdir=logs