声明:
- 🍨 本文为 🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者: K同学啊
本节我们在猫狗训练的基础上去做一些数据增强的操作
1.什么是数据增强
数据增强(Data Augmentation)是指在不改变数据标签的前提下,对原始数据进行各种变换,生成更多样化的训练样本的技术。
简单说:把一张图片"变着花样"复制出多张------旋转一下、翻转一下、调亮一点......这些都叫数据增强。
2.为什么要做数据增强
| 目的 | 说明 |
|---|---|
| 扩充数据集 | 当数据量不足时,用增强生成更多样本 |
| 防止过拟合 | 模型没见过的情况越多,泛化能力越强 |
| 提升鲁棒性 | 让模型对旋转、光照变化等不敏感 |
| 模拟真实场景 | 训练数据永远无法覆盖所有真实情况,增强可以弥补 |
3.常用的调用数据增强的方法
方法一:使用 tf.keras.layers
model = tf.keras.Sequential([
data_augmentation,
网络结构
])
data_augmentation = tf.keras.Sequential([
选择你要的方式
])
通过定义data_augment层选择你想要的增强模式,然后嵌入到网络结构的第一层中,训练时自动应用,测试时自动关闭
方法二:使用 tf.data.Dataset.map()
# 定义增强函数
def augment(image, label):
image = tf.image.random_flip_left_right(image) # 随机翻转
image = tf.image.random_brightness(image, 0.2) # 随机亮度
return image, label
# 应用到数据集
train_ds = train_ds.map(augment, num_parallel_calls=tf.data.AUTOTUNE)
采用函数的方式定义一个图像处理函数,然后用map操作去image和label对应完成,要是有别的图像处理就方便一点,例如顺道调用vgg16官方数据处理方式(reshape之类的)
两种方法的对比
| 特性 | Layers 方式 | map 方式 |
|---|---|---|
| 与模型集成 | ✅ 自动,训练/测试自动切换 | 需手动控制 |
| GPU 加速 | ✅ 在 GPU 上执行 | ⚠️ 需配置 |
| 灵活性 | 中等 | ✅ 极高 |
| 代码简洁 | ✅ 简洁 | 中等 |
4.常用的数据增强方法(以下皆用的layers方式)
原图

4.1 tf.keras.layers.RandomFlip(随机反转)
分为上下和左右反转
data_augmentation = tf.keras.Sequential([
tf.keras.layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
#horizontal水平;vertical垂直
])

4.2 tf.keras.layers.RandomBrightness(随机亮度)
tf.keras.layers.RandomBrightness(
#-1到1,0-255
factor, value_range=(0, 255), seed=None, **kwargs
)

注意!如果图像经历过大小变化,也要将默认的value_range=(0, 255)改为value_range=(0, 1)
4.3 tf.keras.layers.RandomContrast(随机对比度)
tf.keras.layers.RandomContrast(
factor, seed=None, **kwargs
)

4.4 tf.keras.layers.RandomCrop(随机裁剪)
tf.keras.layers.RandomCrop(
height, width, seed=None, data_format=None, name=None, **kwargs
)

4.5 tf.keras.layers.RandomHeight(高度(非裁切))
tf.keras.layers.RandomHeight(
factor, interpolation='bilinear', seed=None, **kwargs
)

4.6 tf.keras.layers.RandomWidth(随机宽度)
tf.keras.layers.RandomWidth(
factor, interpolation='bilinear', seed=None, **kwargs
)

4.7 tf.keras.layers.RandomRotation(随机角度旋转)
tf.keras.layers.RandomRotation(
factor,#旋转圈数
fill_mode='reflect',#边缘填充模式
interpolation='bilinear',#旋转时像素重采样的插值方式
seed=None,
fill_value=0.0,#选了别的填充模式后的填充值
value_range=(0, 255),#像素范围
data_format=None,#输入张量的通道维度位置
**kwargs
)
| 模式 | 说明 | 效果 |
|---|---|---|
'reflect'(默认) |
镜像反射边缘像素 | 最平滑,无突变 |
'constant' |
用固定值填充 | 会看到纯色边框 |
'wrap' |
环绕填充(像素从对面补过来) | 周期性效果 |
'nearest' |
用最近边缘像素填充 | 拉伸边缘 |

4.8 tf.keras.layers.RandomTranslation(随机平移)
tf.keras.layers.RandomTranslation(
height_factor,
width_factor,
fill_mode='reflect',
interpolation='bilinear',
seed=None,
fill_value=0.0,
data_format=None,
**kwargs
)
| 参数 | 默认值 | 说明 |
|---|---|---|
fill_mode |
'reflect' |
空白填充方式 |
interpolation |
'bilinear' |
插值方式 |
seed |
None |
随机种子 |
fill_value |
0.0 |
当 fill_mode='constant' 时的填充值 |
value_range |
(0, 255) |
输入像素范围 |
data_format |
'channels_last' |
数据格式 |
4.9 tf.keras.layers.RandomZoom(随机焦段)
和裁切不同的就是他会注意主题(焦点中心)
tf.keras.layers.RandomZoom(
height_factor,
width_factor=None,
fill_mode='reflect',
interpolation='bilinear',
seed=None,
fill_value=0.0,
data_format=None,
**kwargs
)

训练结果

