transforms.ToTensor() 是 PyTorch 视觉库(torchvision)中最核心、最常用的预处理操作之一。它的主要任务是:把 PIL 图像或 NumPy 数组,安全、规范地转换成 PyTorch 能直接用于深度学习训练的张量(Tensor)。
具体来说,它在后台默默帮你做了以下 三件关键的事情:
1. 像素值归一化 (Scaling)
- 原始状态:读取进来的图片(比如用 OpenCV 或 PIL),像素值通常是整型
uint8,范围在 之间。 - 转换后:
ToTensor()会自动把所有像素值除以 255.0,将范围压缩到 的浮点数。 - 为什么重要:神经网络在面对 这样较大的数值时,容易引起梯度爆炸或收敛变慢。归一化到 (甚至后续再做标准化)能让模型训练更稳定。
2. 维度通道重排 (Permutation / HWC CHW)
- 原始状态:常规图像处理库(如 NumPy、OpenCV、PIL)存储图片的习惯是 HWC 格式(Height Width Channels)。比如一张 2828 的彩色图,它的形状是
(28, 28, 3)(高、宽、3个颜色通道 RGB)。 - 转换后:PyTorch 的卷积层(
nn.Conv2d)死死规定必须接收 CHW 格式的张量。ToTensor()会自动把矩阵转置,变成(3, 28, 28)(通道数在前,高宽在后)。 - 为什么重要:这是 PyTorch 底层 C++ 卷积算子硬性规定的内存排列方式。
3. 数据类型转换 (Dtype)
- 原始状态:通常是
numpy.uint8或PIL.Image对象。 - 转换后:变成 PyTorch 的
torch.FloatTensor(32位浮点型张量)。 - 为什么重要:只有浮点型 Tensor 才能参与 PyTorch 的自动求导(Autograd)和反向传播计算。
💡 简明对比示意图
| 阶段 | 输入 (PIL Image / NumPy) | transforms.ToTensor() 之后 |
|---|---|---|
| 数据类型 | uint8 | torch.FloatTensor |
| 数值范围 | [0, 255] 整数 | [0.0, 1.0] 浮点数 |
| 矩阵形状 | (H, W, C) (如 224, 224, 3) | (C, H, W) (如 3, 224, 224) |
在实际写代码时,它通常作为数据流水线的头号大将:
from torchvision import transforms
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(), # <--- 在这里把图片变成 PyTorch 的 Tensor
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 随后常接标准化
])