transforms.Compose,transforms.ToTensor(),transforms.Normalize()的含义与原理

本文详细介绍了PyTorch中用于CNN神经网络数据预处理的常用方法,包括transforms.Compose的组合功能,transforms.ToTensor()将图像数据标准化到[0,1]区间,以及transforms.Normalize()通过指定均值和标准差进一步将数据归一化到[-1,1]。这些步骤对于训练模型至关重要,确保了输入数据的一致性和模型的稳定训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

transforms.Compose,transforms.ToTensor(),transforms.Normalize()的含义与原理

1.问题描述

  • 问题来源于pytorch实现CNN神经网络的示例代码读取数据的部分:
transform = transforms.Compose(
            [transforms.ToTensor(),
             transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

作用主要是读取CIFAR10数据集时,归一化操作,它的含义是将图像值都转换到[-1,1]之间,但其中细节并不清楚。以下通过源码解读,简述三个函数的作用及转换原理。

2.transforms.Compose

Composes several transforms together. This transform does not support torchscript.
将几个变换组合在一起。这个转换不支持torchscript。

  • 即组合几个变换方法,按顺序变换相应数据。
  • 其中torchscript为脚本模块,用于封装脚本跨平台使用,若需要支持此情况,需要使用torch.nn.Sequential,而不是compose
  • 对应于问题描述中代码,即先应用ToTensor()使[0-255]变换为[0-1],再应用Normalize自定义标准化

3.transforms.ToTensor()

Convert a PIL Image or numpy.ndarray to tensor
转换一个PIL库的图片或者numpy的数组为tensor张量类型;转换从[0,255]->[0,1]

  • 实现原理,即针对不同类型进行处理,原理即各值除以255,最后通过torch.from_numpyPIL Image or numpy.ndarray针对具体数值类型比如Int32,int16,float等转成torch.tensor数据类型
  • 需要注意的是,源码中有一小段内容:
    if isinstance(pic, np.ndarray):
        # handle numpy array
        if pic.ndim == 2:
            pic = pic[:, :, None]

        img = torch.from_numpy(pic.transpose((2, 0, 1))).contiguous()
        # backward compatibility
        if isinstance(img, torch.ByteTensor):
            return img.float().div(255)
        else:
            return img

我们可以看到在转换过程中有一个轴的转置操作pic.transpose((2, 0, 1))contiguous() 函数

  • pic.transpose((2, 0, 1))将第三维轴换到第一个位置,这样做的原因主要是因为PIEimage与torch和numpy数据类型多维参数位置的区别,以下表说明
参数含义
torch:(x,y,z)x个y*z
PIEimage:(x,y,z)z个x*y

即三维表示的结构顺序有区别,导致numpy与torch多维转换时需要转置

4.transforms.Normalize()

Normalize a tensor image with mean and standard deviation
通过平均值和标准差来标准化一个tensor图像,公式为:
output[channel] = (input[channel] - mean[channel]) / std[channel]

transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))解释:

  • 第一个(0.5,0.5,0.5) 即三个通道的平均值
  • 第二个(0.5,0.5,0.5) 即三个通道的标准差值

由于ToTensor()已经将图像变为[0,1],我们使其变为[-1,1],以第一个通道为例,将最大与最小值代入公式

  • (0-0.5)/0.5=-1
  • (1-0.5)/0.5=1
  • 其他数值同理操作,即映射到[-1,1]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值