一文讲清楚人工智能正则化技术--数据增强前言 在上一篇文章中,笔者为大家讲述了在机器学习和深度学习中(尤其是神经网络)常
前言
在上一篇文章中,笔者为大家讲述了在机器学习和深度学习中(尤其是神经网络)常见的模型训练停止正则化方法---早停法,今天笔者将会为大家讲解最后一个常见的正则化方法--数据增强。
一、 定义
数据增强是我们机器学习和深度学习中常用的正则化技术之一,它通过在原始数据集上应用一系列随机变换来增加数据的多样性,从而提高模型的泛化能力。数据增强对于处理小数据集、减少模型过拟合以及模拟真实世界中的各种变化非常有效。
二、主要类型和方法
1. 几何变换:
例如旋转、缩放、翻转和裁剪图像。 其中的随机裁剪是指从图像中随机裁剪出一部分,可以提供新的视角。(常用于CV方向,常用在CNN卷积神经网络算法)
图像裁剪
图像翻转
代码实战 :
当然,下面是我使用Python和OpenCV库进行几何变换数据增强的示例项目代码。这个示例中包括了旋转、缩放、翻转和裁剪图像的基本操作。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转换为RGB
# 旋转
def rotate_image(image, angle):
center = (image.shape[1] / 2, image.shape[0] / 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
return rotated
# 缩放
def scale_image(image, scale_factor):
resized = cv2.resize(image, (int(image.shape[1] * scale_factor), int(image.shape[0] * scale_factor)))
return resized
# 翻转
def flip_image(image, flip_code):
flipped = cv2.flip(image, flip_code)
return flipped
# 裁剪
def crop_image(image, x, y, w, h):
cropped = image[y:y+h, x:x+w]
return cropped
# 应用几何变换
rotated_image = rotate_image(image, 45) # 旋转45度
scaled_image = scale_image(image, 0.5) # 缩放为原来的一半大小
flipped_image = flip_image(image, 1) # 水平翻转
cropped_image = crop_image(image, 50, 50, 100, 100) # 裁剪图像
# 显示结果
plt.figure(figsize=(10, 10))
plt.subplot(231)
plt.imshow(image)
plt.title('Original Image')
plt.subplot(232)
plt.imshow(rotated_image)
plt.title('Rotated Image')
plt.subplot(233)
plt.imshow(scaled_image)
plt.title('Scaled Image')
plt.subplot(234)
plt.imshow(flipped_image)
plt.title('Flipped Image')
plt.subplot(235)
plt.imshow(cropped_image)
plt.title('Cropped Image')
plt.show()
解释:
- 读取图像:使用
cv2.imread
读取图像,并将其从BGR颜色空间转换为RGB颜色空间。 - 旋转:使用
cv2.getRotationMatrix2D
生成旋转矩阵,然后使用cv2.warpAffine
应用旋转矩阵。 - 缩放:使用
cv2.resize
对图像进行缩放。 - 翻转:使用
cv2.flip
对图像进行水平或垂直翻转。 - 裁剪:直接使用数组切片对图像进行裁剪。
- 显示结果:使用
matplotlib
显示原始图像和变换后的图像。
2. 颜色变换:
调整亮度、对比度、饱和度等。其中的色彩抖动是指随机调整图像的亮度、对比度和饱和度,模拟不同的光照条件。(同上,也是CV方向)
色彩抖动
代码实战:
这里我使用Python和OpenCV库进行颜色变换数据增强码。下面这个例子包括了调整亮度、对比度和饱和度等的操作。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转换为RGB
# 调整亮度
def adjust_brightness(image, value):
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv)
lim = 255 - value
v[v > lim] -= value
v[v <= lim] += value
final_hsv = cv2.merge((h, s, v))
img_adjust = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2RGB)
return img_adjust
# 调整对比度
def adjust_contrast(image, contrast=1.0):
f = 255 * contrast
alpha = f if f < 128 else 1 - 1.0 / f
new = cv2.addWeighted(image, alpha, image, 0, f)
return new
# 调整饱和度
def adjust_saturation(image, saturation=1.0):
hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
h, s, v = cv2.split(hsv)
s = cv2.multiply(s, saturation)
s = np.clip(s, 0, 255)
final_hsv = cv2.merge((h, s, v))
img_saturation = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2RGB)
return img_saturation
# 应用颜色变换
brightened_image = adjust_brightness(image, 50) # 增加亮度
contrasted_image = adjust_contrast(image, 2.0) # 增加对比度
saturated_image = adjust_saturation(image, 1.5) # 增加饱和度
# 显示结果
plt.figure(figsize=(10, 10))
plt.subplot(141)
plt.imshow(image)
plt.title('Original Image')
plt.subplot(142)
plt.imshow(brightened_image)
plt.title('Brightened Image')
plt.subplot(143)
plt.imshow(contrasted_image)
plt.title('Contrasted Image')
plt.subplot(144)
plt.imshow(saturated_image)
plt.title('Saturated Image')
plt.show()
解释:
- 读取图像:使用
cv2.imread
读取图像,并将其从BGR颜色空间转换为RGB颜色空间。 - 调整亮度:将图像转换到HSV颜色空间,调整V(亮度)通道,然后转换回RGB颜色空间。
- 调整对比度:通过加权平均的方式调整图像的对比度。
- 调整饱和度:将图像转换到HSV颜色空间,调整S(饱和度)通道,然后转换回RGB颜色空间。
- 显示结果:使用
matplotlib
显示原始图像和变换后的图像。
3. 噪声注入:
向图像添加随机噪声。(增强模型的鲁棒性和抗干扰能力,泛化能力)。
代码实战 :
下面是我使用Python和NumPy库进行噪声注入数据增强的示例,其中包括了向图像添加高斯噪声和椒盐噪声。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
image_path = 'path_to_your_image.jpg'
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转换为RGB
# 添加高斯噪声
def add_gaussian_noise(image):
row, col, ch = image.shape
mean = 0
var = 0.1
sigma = var ** 0.5
gauss = np.random.normal(mean, sigma, (row, col, ch))
gauss = gauss.reshape(row, col, ch)
noisy_image = image + gauss
noisy_image = np.clip(noisy_image, 0, 255).astype(np.uint8)
return noisy_image
# 添加椒盐噪声
def add_salt_and_pepper_noise(image, salt_prob, pepper_prob):
row, col, ch = image.shape
salt_num = np.ceil(salt_prob * image.size)
pepper_num = np.ceil(pepper_prob * image.size)
# 添加盐噪声
coords = [np.random.randint(0, i - 1, int(salt_num)) for i in image.shape]
image[coords[0], coords[1], :] = 1
# 添加椒噪声
coords = [np.random.randint(0, i - 1, int(pepper_num)) for i in image.shape]
image[coords[0], coords[1], :] = 0
return image
# 应用噪声注入
gaussian_noisy_image = add_gaussian_noise(image)
salt_pepper_noisy_image = add_salt_and_pepper_noise(image, 0.01, 0.01)
# 显示结果
plt.figure(figsize=(10, 5))
plt.subplot(131)
plt.imshow(image)
plt.title('Original Image')
plt.subplot(132)
plt.imshow(gaussian_noisy_image)
plt.title('Gaussian Noise Image')
plt.subplot(133)
plt.imshow(salt_pepper_noisy_image)
plt.title('Salt and Pepper Noise Image')
plt.show()
解释:
- 读取图像:使用
cv2.imread
读取图像,并将其从BGR颜色空间转换为RGB颜色空间。 - 添加高斯噪声:生成与图像大小相同的高斯分布随机数,然后加到图像上。使用
np.clip
确保像素值在0到255之间。 - 添加椒盐噪声:随机选择一些像素点,将它们设置为白色(盐噪声)或黑色(椒噪声)。
- 显示结果:使用
matplotlib
显示原始图像和添加噪声后的图像。
4. 基于深度学习的数据增强:
使用生成对抗网络(GANs)或变分自编码器(VAEs)生成新的数据。这里就不过多讲解这个方法了,因为只有在某些特殊的大项目里面才会用到这个部分,而且成本也不低。
三、应用技巧
1. 我们目前应用的场景:
- 图像分类:通过增强图像来模拟真实世界的变化,医学成像等等。(这个应用是目前应用最广的,往往当笔者训练该任务模型时数据集不够的时候都喜欢采取这种简单方便的新数据生成模式)
- 自然语言处理:同义词替换、句子重排等(这个要慎用,因为语言上的东西不像图片,根本的东西不容易改变,语言需要考虑很多,不同的语境下不同的语句意思可能完全不一样)。
2. 为什么要使用数据增强:
- 提高模型性能,减少数据依赖:通过增加数据多样性来提升模型的泛化能力。减少对大型数据集的需求。
- 缓解过拟合:通过提供更多的数据变体来防止模型过度拟合训练数据。
3. 挑战:
- 可扩展性:确保增强数据可被多种模型使用。
- 数据异质性:不同数据集具有不同的特征,需要考虑这些特征进行增强。
- 相关性:确保增强数据的相关性和质量。
总之,数据增强是深度学习领域中非常重要的技术,它通过生成更多的训练样本来提高模型的泛化能力和鲁棒性。通过合理使用数据增强,可以构建出更加强大、更加智能的深度学习模型。
四、Reference
以上就是笔者关于最后一个人工智能正则化方法--数据增强的讲解,欢迎大家点赞,收藏,交流和关注,O(∩_∩)O谢谢!
转载自:https://juejin.cn/post/7417521775608348698