数据扩充

数据扩充

深度卷积网络自身拥有强大的表达能力,网络本身更需要大量的数据来驱动模型训练,否则极有可能陷入过拟合的窘境.实际中,并不是所有数据集都拥有海量样本.因此,在实践中数据扩充是非常有必要的.有效的数据扩充不仅能扩充训练样本数量,还能增加训练样本额多样性,一方面可以避免过拟合,另一方面提升模型的性能.

简单的数据扩充方式

在数据扩充方面,简单的方法有图像水平翻转、随机扣取、尺寸变换和旋转.在此基础上,对原图或已变化的图像进行色彩抖动也是一种常用的数据扩充手段.

特殊的数据扩充方式

  • Fancy PCA

Fancy PCA首先对所有训练数据的R,G,B像素值进行主成分分析(PCA)操作,得到对应的特征向量和特征值,然后根据特征向量和特征值可以计算一组随机值,将其作为扰动加到原像素值中即可.

  • 监督式数据扩充

借助图像标记信息的新型数据扩充方式.首先根据元数据训练一个分类的初始模型,利用该模型对每张生成对应的特征图或热力图.这张图可指示图像区域与场景标记之间的相关概率,之后根据此概率映射回原图选择较强相关的图像区域作为扣取的图像块.适用于高层予以图像分类任务.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import numpy as numpy
import torch
from torchvision.transforms import *
class RandomErasing(object):
def __init__(self, probability=0.5, sl=0.02, sh=0.4, r1 = 0.3, mean=[0.4914, 0.4822, 0.4465]):
self.probability = probability
self.sl = sl
self.sh = sh
self.r1 = r1
def __call__(self, img):
if random.uniform(0, 1) > self.probability:
return img
for attempt in range(100):
area = img.size()[1] * img.size()[2]
target_area = random.uniform(self.sl, self.sh) * area
aspect_ratio = random.uniform(self.r1, 1/self.r1)
h = int(round(math.sqrt(target_area * aspect_ratio)))
w = int(round(math.sqrt(target_area / aspect_ratio)))
if w <= img.size()[2] and h <= img.size()[1]:
x1 = random.randint(0, img.size()[1] - h)
y1 = random.randint(0, img.size()[2] - w)
if img.size()[0] == 3:
img[0, x1:x1+h, y1:y1+w] = self.mean[0]
img[1, x1:x1+h, y1:y1+w] = self.mean[1]
img[2, x1:x1+h, y1:y1+w] = self.mean[2]
else:
img[0, x1:x1+h, y1:y1+w] = self.mean[0]
return img
return img
-------------本文结束感谢您的阅读-------------
很有帮助,打赏感谢!
0%