PyTorch图像数据转换为张量(Tensor)并进行归一化的标准操作
transform = ToTensor()
是 PyTorch 中用于将图像数据转换为张量(Tensor)并进行归一化的标准操作,以下是对其功能的逐层解析及关键细节:
核心功能总结
功能 | 描述 |
---|---|
类型转换 | 将 PIL Image / numpy 数组 → PyTorch Tensor (dtype: torch.float32 ) |
数值归一化 | 像素值从 [0, 255] → [0.0, 1.0] (通过 ÷255 实现) |
维度重排 | (H×W×C)* → (C×H×W) |
注:(*) 仅当输入为 numpy 数组时需满足此内存布局,PIL Image 无需关注此规则
完整转换流程详解
1. 输入数据来源
支持两种常见格式:
- PIL Image(推荐):直接读取的图片对象
- Numpy Array:形状需为
(H, W, C)
(Height × Width × Channels)
2. 执行的操作
graph LR
A[原始图像] --> B{数据源判断}
B -->|PIL Image| C[拆分通道 + 转Float + /255]
B -->|Numpy Array| D[转置维度 + 转Float + /255]
C & D --> E[生成 Torch Tensor]
3. 具体变化示例
以灰度图为例(单通道):
阶段 | 数据形式 | 取值范围 | 数据类型 | 备注 |
---|---|---|---|---|
原始PIL图像 | PIL Image | [0, 255] | uint8 | 高度×宽度 |
转换后Tensor | torch.Tensor | [0.0, 1.0] | float32 | [Channel, Height, Width] |
彩色图像(RGB三通道)同理,每个通道独立归一化。
关键技术点解析
为何要除以255?
- 物理意义:将8位整型(0~255)映射到浮点型的连续区间[0,1],符合神经网络对输入范围的要求
- 数学优势:避免大数值导致的梯度爆炸,加速收敛
- 对比实验:不除以255的训练损失通常比归一化的高数十倍
维度重排的必要性
- PyTorch设计规范:要求张量采用
(Batch_Size, Channels, Height, Width)
格式