深度学习我们要采集数据,要设计模型、训练模型,最后需要将模型部署。那么哪一个部分最重要呢?其实最重要的部分就是数据的处理部分,因为数据代表着特征,当我们的特征越丰富,特征越明显,我们的模型识别率才会越高。既然如此,那么数据又该如何进行处理呢?
数据处理主要分为五个部分:数据采集、数据清洗、数据标注、数据增强、数据预处理。
一、数据采集
我们需要知道如何准确的采集,当数据不够时需要进行怎样的处理。
(1)数据样本数量不够时如何处理?
- 使用迁移学习:使用类似数据训练好的模型,在原参数的基础上,使用少量的数据进行微调。
- 使用数据增强技术:增加数据量,在一定程度上增加数据的特征数量。例如:缩放、旋转、拼接等
- 模拟数据:尽量模拟项目需求制造数据,结合少量的真是样本进行训练。甚至可以使用生成模型,生成数据。
(2)采集数据的四个指标——(样本数量、覆盖性、多样性、均衡性)
样本数量:样本的数量越多,所包含的数据特征就更多。但是数据不能够通过重复增加样本数量。
覆盖性:覆盖性是指该任务下的数据类别够不够,例如ImageNet的1000个类
多样性:包含的场景、角度、噪声、明暗等。这会影响到模型的泛化能力。
均衡性:就是让不同类别下的样本数量尽量一致,如果样本数量的分布不够均匀,会影响到模型的效果。
二、数据清洗
数据清洗的目的是为了增加数据集的质量,减少误差。
- 去掉或修改错误数据
- 去掉重复数据
- 补全缺失数据
- 一致性原则:就是定义标准要统一,否则模型容易出现震荡。训练集和测试集保持一致性,尽量满足独立同分布(IID)。
三、数据标注
就是标注的时候尽量保持数据的均衡性。
当数据标注中出现多种标准时如何解决?
可以使用这个数据集训练一个模型出来,然后重新标注一小部分数据,再加上数据增强技术,让训练好的模型进行微调。
四、数据增强技术
(1)形状变换
形状变换主要包括的是将图像进行简单的线性变换,例如:
- 仿射变换:平移、旋转、缩放、裁切等
- 透视变换:将图像投影到一个新的视平面。
- 非线性变换:给数值加一个函数,非线性转换包括log转化,平方根转化和弦转化等
(2)颜色空间的变换
- 色彩的变换:对图片的三个通道颜色进行改变
- 饱和度的变换:将图片转化为HSV类型,然后对饱和度进行调整。
- 图片明暗变换:调整图片的亮度和对比度。
(3)加入噪声
可以加入高斯采样,增加数据的鲁棒性。
(4)遮罩技术
- cutout:随机生成一个正方形,将图片中的一部分给遮住,遮罩区域像素值全置为0.
- dropblock:弥补了drop out会使得特征较为离散的缺点。它随机抑制一块数据。
- Mixup:将随机的两个样本随机混合,分类的标签按比例分配。
- CutMix:首先随机选取两个样本,将其中一张图片随机切除一块区域,然后该部分区域填充另一张图片。分类标签按比例分配。
- Mosaic:这个方法是cutmix方法的一个改进版本。其实用四张图片,对四张图片进行拼接,拼接成一张新的图片。这样能够丰富物体检测的背景。
五、数据预处理
首先我们得弄清楚数据是离散数据还是连续数据。
离散数据:
- one-hot编码:稀疏编码,比较浪费计算和内存。
- 词向量(word embedding):稠密编码。
连续数据:
- 归一化:可以根据下面公式计算,输出的区间在[0, 1],如果你想将数据规范到[-1, 1]之间,可以先减去0.5, 然后再乘以2。当然还有其他的归一化公式。
- 标准化:大部分数据在[-1, 1]
def norm(a):
# a是一个二维数组。
a = np.array(a)
return (a - a.mean(1, keepdims=True)) / (a.std(1, keepdim=True) + 1e-9)
以上就是数据处理的全部流程啦!
网友评论