PyTorch中內置的隨機擦除(Random Erasing)數據增強通過torchvision.transforms.RandomErasing
實現,以下是原理和用法的詳細說明:
核心原理
-
正則化作用:
- 隨機擦除在訓練圖像上隨機遮蓋一個矩形區域,模擬遮擋場景,強迫模型學習非主導特征,減輕過擬合。
- 類似于
Dropout
(針對神經元),但作用于輸入空間(圖像像素)。
-
實現細節:
- 區域選擇:隨機生成一個矩形區域:
- 面積比例:
scale=(min_area, max_area)
(默認(0.02, 0.33)
) - 寬高比:
ratio=(min_ratio, max_ratio)
(默認(0.3, 3.3)
)
- 面積比例:
- 填充內容:
value
:填充值,可以是:- 單數字(如
0
)→ 所有通道用該值填充。 - 元組
(R, G, B)
→ 每通道獨立填充。 - 字符串
'random'
→ 使用均勻分布的隨機值(0255整數或0.01.0浮點)。
- 單數字(如
- 區域選擇:隨機生成一個矩形區域:
PyTorch內置實現
1. 導入與初始化
from torchvision import transformstransform = transforms.Compose([transforms.ToTensor(),transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]),transforms.RandomErasing(p=0.5, # 應用概率(默認0.5)scale=(0.02, 0.2), # 遮蓋面積比例范圍ratio=(0.3, 3.3), # 寬高比范圍value='random', # 填充值(或指定數字/元組)inplace=False # 是否原地修改)
])
2. 關鍵參數
參數 | 作用 |
---|---|
p | 執行概率(默認0.5) |
scale | 矩形區域面積占比范圍(默認(0.02, 0.33) ) |
ratio | 矩形寬高比范圍(默認(0.3, 3.3) ) |
value | 填充值:int /float 、元組(R, G, B) 或'random' (默認0) |
inplace | 是否原地操作(默認False ) |
示例代碼
import torch
from torchvision.transforms import RandomErasing
import matplotlib.pyplot as plt# 初始化隨機擦除(50%概率執行)
eraser = RandomErasing(p=0.5, value="random")# 模擬輸入圖像(3通道,224x224)
image = torch.randn(3, 224, 224) # 歸一化后的數據# 應用隨機擦除
augmented = eraser(image)# 可視化
plt.subplot(121)
plt.title("Original")
plt.imshow(image.permute(1, 2, 0).clamp(-1, 1).numpy() * 0.5 + 0.5)
plt.subplot(122)
plt.title("Random Erasing")
plt.imshow(augmented.permute(1, 2, 0).clamp(-1, 1).numpy() * 0.5 + 0.5)
plt.show()
輸出效果:
- 左圖:原始圖像。
- 右圖:隨機出現一個矩形遮蓋區域(用噪聲填充)。
使用注意事項
-
放置位置:
- 必須在
ToTensor()
和Normalize()
之后,因為操作對象是張量(shape=[C, H, W]
)。 - 如果使用
value='random'
,需確保填充值與圖像歸一化范圍兼容。
- 必須在
-
填充值選擇:
- 歸一化后的圖像:推薦用
value=0
(相當于均值)或與數據集統計量匹配的值。 - 未歸一化圖像:用
value='random'
生成噪聲更合理。
- 歸一化后的圖像:推薦用
-
常見設置:
- 論文推薦:
p=0.5
,scale=(0.02, 0.33)
,ratio=(0.3, 3.3)
,value=0
。 - 對小物體數據集(如CIFAR):調小
scale
(如(0.02, 0.1)
)。
- 論文推薦:
底層算法邏輯
-
區域生成:
-
隨機選擇一個滿足
scale
和ratio
的矩形框(嘗試10次,失敗則跳過)。 -
計算矩形區域:
area=img_area×random(scalemin,scalemax)\text{area} = \text{img\_area} \times \text{random}(\text{scale}_\text{min}, \text{scale}_\text{max})area=img_area×random(scalemin?,scalemax?)
aspect_ratio=random(ratiomin,ratiomax)\text{aspect\_ratio} = \text{random}(\text{ratio}_\text{min}, \text{ratio}_\text{max})aspect_ratio=random(ratiomin?,ratiomax?)
h=area×aspect_ratio,w=area/aspect_ratioh = \sqrt{\text{area} \times \text{aspect\_ratio}}, \quad w = \sqrt{\text{area} / \text{aspect\_ratio}}h=area×aspect_ratio?,w=area/aspect_ratio?
-
-
覆蓋操作:
image[:, top:top+h, left:left+w] = value # 矩形區域賦值
效果對比(實驗數據)
數據集 | 基線準確率 | +隨機擦除 | 提升 |
---|---|---|---|
CIFAR-10 | 94.1% | 95.6% | +1.5% |
ImageNet | 75.3% | 77.1% | +1.8% |
結論:對小/密集物體數據集效果顯著(如CIFAR、PASCAL VOC)。
通過這種方式,隨機擦除以極小計算成本提升模型魯棒性,是圖像分類任務的實用增強工具。