数据增强操作详解
代码逻辑说明
if self.mode == 'train':
transform = transforms.Compose([
transforms.Resize((224, 224)), # 调整图像尺寸
transforms.RandomHorizontalFlip(p=0.5), # 随机水平翻转
transforms.ToTensor() # 转换为张量
])
else:
transform = transforms.Compose([
transforms.Resize((224, 224)), # 统一尺寸
transforms.ToTensor() # 转换为张量
])
数据增强操作解析
1. transforms.Resize((224, 224))
作用:将所有图像统一缩放到
224x224像素必要性:
满足卷积神经网络(如ResNet)对输入尺寸的要求
统一不同原始尺寸的图像,避免计算错误
2. transforms.RandomHorizontalFlip(p=0.5)(仅训练模式)
作用:以50%的概率对图像进行水平镜像翻转
示例:
原图 → 🐱 (猫脸朝左)
翻转后 → 🐱 (猫脸朝右)
增强效果:使模型学习到物体方向无关的特征
3. transforms.ToTensor()
作用:
将PIL图像或NumPy数组转换为PyTorch张量
自动将像素值归一化到
[0, 1]范围
数据格式:
(C, H, W)通道优先格式
数据增强的核心作用
1. 增加数据多样性
通过对训练数据引入可控的随机性,人工扩展数据集
例如:翻转后的图像被视为新样本,但标注不变
2. 提升模型泛化能力
迫使模型学习方向无关、位置无关的本质特征
防止模型对训练集中的偶然模式过拟合(如特定物体朝向)
3. 模拟真实场景变化
实际应用中物体可能出现任意方向(如镜面反射场景)
增强后的模型对这类变化更具鲁棒性
4. 缓解数据不足问题
当原始训练数据较少时,增强可有效扩大数据集规模
相当于免费的”数据标注”
验证/测试集不增强的原因
1. 评估真实性能
验证集和测试集需要反映模型在真实场景中的表现
应使用原始数据分布进行评估
2. 保证结果可复现性
验证/测试过程需要确定性(去随机化)
多次推理同一图像应得到相同结果
3. 避免信息污染
随机增强可能人为制造验证集不存在的数据模式
导致对模型性能的错误估计
扩展:其他常见数据增强方法
# 更复杂的增强示例
train_transform = transforms.Compose([
transforms.RandomResizedCrop(224), # 随机缩放裁剪
transforms.RandomHorizontalFlip(), # 水平翻转
transforms.ColorJitter(0.2, 0.2, 0.2), # 颜色抖动
transforms.RandomRotation(15), # 随机旋转
transforms.ToTensor(),
transforms.Normalize(mean, std) # 标准化
])
总结
数据增强是训练阶段的关键策略,通过可控的随机变换提升模型鲁棒性
验证/测试阶段需保持数据处理确定性,反映真实场景性能
本例中通过简单的水平翻转实现了基础增强,可根据任务复杂度添加更多增强操作 ```
文档信息
- 本文作者:Awei
- 本文链接:https://shuke-rrrw.github.io/Awei.github.io//2025/03/28/CNN_learning_transform/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
