>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/AtyZUu_j2k_ScNH6e732ow) 中的学习记录博客**
>- **🍦 参考文章:365天深度学习训练营-第10周:数据增强(训练营内部成员可读)**
>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**
>- **🚀 文章来
数据增强
以下是一些常用的数据增强技术及其在 TensorFlow 和 Keras 中的实现函数的简易使用示例:
1. 随机翻转(Random Flip):
使用 TensorFlow 函数:
import tensorflow as tf
# 随机水平翻转
flipped_image = tf.image.random_flip_left_right(image)
# 随机垂直翻转
flipped_image = tf.image.random_flip_up_down(image)
使用 Keras 函数:
import tensorflow as tf
# 创建一个随机水平翻转的层
random_flip = tf.keras.layers.experimental.preprocessing.RandomFlip("horizontal")
# 对输入图像进行翻转
flipped_image = random_flip(image)
1. 随机旋转(Random Rotation):
使用 TensorFlow 函数:
import tensorflow as tf
# 随机旋转(90°、180° 或 270°)
rotated_image = tf.image.random_rot90(image)
# 旋转 90°
rotated_image = tf.image.rot90(image)
使用 Keras 函数:
import tensorflow as tf
# 创建一个随机旋转的层,设置旋转角度范围为 ±45°(约 ±0.785π)
random_rotation = tf.keras.layers.experimental.preprocessing.RandomRotation(0.785)
# 对输入图像进行旋转
rotated_image = random_rotation(image)
1. 随机缩放(Random Zoom):
使用 TensorFlow 函数:
import tensorflow as tf
# 随机剪切和缩放到固定大小(例:缩放到原图的 80%)
cropped_image = tf.image.random_crop(image, size=(int(height * 0.8), int(width * 0.8), channels))
使用 Keras 函数:
import tensorflow as tf
# 创建一个随机缩放的层,设置缩放范围为 ±20%
random_zoom = tf.keras.layers.experimental.preprocessing.RandomZoom(height_factor=(-0.2, 0.2), width_factor=(-0.2, 0.2))
# 对输入图像进行缩放
zoomed_image = random_zoom(image)
1. 随机平移(Random Translation):
使用 Keras 函数:
import tensorflow as tf
# 创建一个随机平移的层,设置平移范围为 ±10%(在宽度和高度方向)
random_translation = tf.keras.layers.experimental.preprocessing.RandomTranslation(height_factor=(-0.1, 0.1), width_factor=(-0.1, 0.1))
# 对输入图像进行平移
translated_image = random_translation(image)
这些数据增强方法可以单独运用,也可以组合实现更复杂的数据增强。在实际使用中,选择的增强方法和参数设置需要根据具体任务和数据集特点进行调整。
增强方式
方法一:将其嵌入model中
这种方法在模型结构中包含数据增强层,使得数据增强可以作为模型的一部分进行训练。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers.experimental.preprocessing import (
RandomFlip, RandomRotation, RandomZoom, RandomTranslation)
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
def build_model(input_shape):
model = Sequential([
# 数据增强层
RandomFlip("horizontal", input_shape=input_shape),
RandomRotation(0.1),
RandomZoom(0.1),
# 其他模型层
Conv2D(32, (3, 3), activation="relu"),
MaxPooling2D((2, 2)),
Flatten(),
Dense(64, activation="relu"),
Dense(10, activation="softmax")
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
return model
方法二:在Dataset数据集中进行数据增强
这种方法在预处理数据集时直接应用数据增强操作。
import tensorflow as tf
import numpy as np
def augment_image(image, label):
# 随机水平翻转
image = tf.image.random_flip_left_right(image)
# 随机旋转
image = tf.image.random_rot90(image)
# 随机缩放
image = tf.image.random_zoom(
image, zoom_range=[0.9, 1.1]
)
return image, label
# 创建一个模拟数据集
num_samples = 100
image_height, image_width, channels = 32, 32, 3
X = np.random.randint(0, 256, (num_samples, image_height, image_width, channels))
y = np.random.randint(0, 10, num_samples)
# 将 NumPy 数组转换为 tf.data.Dataset
dataset = tf.data.Dataset.from_tensor_slices((X, y))
# 应用数据增强
dataset = dataset.map(augment_image)
# 批处理、打乱和重复数据集
dataset = dataset.batch(32).shuffle(buffer_size=100).repeat()
您可以根据需要为 TensorFlow 和 Keras 创建自定义数据增强功能。以下示例说明了如何在 TensorFlow 中创建一个自定义的随机噪声增强函数:
1. 自定义随机噪声增强函数:
import tensorflow as tf
import numpy as np
def random_noise(image, stddev=0.1, seed=None):
with tf.device("/cpu:0"):
shape = tf.shape(image)
noise = tf.random.normal(shape, mean=0.0, stddev=stddev, seed=seed)
noisy_image = tf.add(image, noise)
return tf.clip_by_value(noisy_image, 0.0, 1.0)
该 `random_noise` 函数会在图像中加入具有给定标准差的高斯噪声,并确保结果图像的像素值在 \[0, 1\] 范围内。
1. 在 TensorFlow 数据集中应用自定义增强函数:
def augment_image(image, label):
# 已经存在的增强方法(例如:翻转、旋转等)
# ...
# 应用自定义随机噪声增强函数
image = random_noise(image, stddev=0.1)
return image, label
dataset = dataset.map(augment_image)
在创建自定义数据增强功能时,务必在函数内部将原始图像和结果图像像素值限制在\[0, 1\]范围内,以防加入增强效果后出现数据值溢出带来的问题。此外,确保函数可以适用于任何大小的输入图像,可以通过在函数内部查找图像形状来实现适当的调整。
这种方式,您可以实现各种自定义数据增强功能以满足特定应用需求。