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)
格式