您的位置:

python数据增强三种方法(常用的数据增强方法)

本文目录一览:

数据增强的方法有哪些

1 什么是数据增强?

数据增强也叫数据扩增,意思是在不实质性的增加数据的情况下,让有限的数据产生等价于更多数据的价值。

比如上图,第1列是原图,后面3列是对第1列作一些随机的裁剪、旋转操作得来。

每张图对于网络来说都是不同的输入,加上原图就将数据扩充到原来的10倍。假如我们输入网络的图片的分辨率大小是256×256,若采用随机裁剪成224×224的方式,那么一张图最多可以产生32×32张不同的图,数据量扩充将近1000倍。虽然许多的图相似度太高,实际的效果并不等价,但仅仅是这样简单的一个操作,效果已经非凡了。

如果再辅助其他的数据增强方法,将获得更好的多样性,这就是数据增强的本质。

数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法,无监督的数据增强分为生成新的数据和学习增强策略两个方向。

2 有监督的数据增强

有监督数据增强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据增强和多样本数据增强,其中单样本又包括几何操作类,颜色变换类。

2.1. 单样本数据增强

所谓单样本数据增强,即增强一个样本的时候,全部围绕着该样本本身进行操作,包括几何变换类,颜色变换类等。

(1) 几何变换类

几何变换类即对图像进行几何变换,包括翻转,旋转,裁剪,变形,缩放等各类操作,下面展示其中的若干个操作。

水平翻转和垂直翻转

随机旋转

随机裁剪

变形缩放

翻转操作和旋转操作,对于那些对方向不敏感的任务,比如图像分类,都是很常见的操作,在caffe等框架中翻转对应的就是mirror操作。

翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。

以上操作都不会产生失真,而缩放变形则是失真的。

很多的时候,网络的训练输入大小是固定的,但是数据集中的图像却大小不一,此时就可以选择上面的裁剪成固定大小输入或者缩放到网络的输入大小的方案,后者就会产生失真,通常效果比前者差。

(2) 颜色变换类

上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身的内容,就属于颜色变换类的数据增强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。

基于噪声的数据增强就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是高斯噪声。更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以Coarse Dropout方法为代表,甚至还可以对图片上随机选取一块区域并擦除图像信息。

添加Coarse Dropout噪声

颜色变换的另一个重要变换是颜色扰动,就是在某一个颜色空间通过增加或减少某些颜色分量,或者更改颜色通道的顺序。

颜色扰动

还有一些颜色变换,本文就不再详述。

几何变换类,颜色变换类的数据增强方法细致数还有非常多,推荐给大家一个git项目:

预览一下它能完成的数据增强操作吧。

2.2. 多样本数据增强

不同于单样本数据增强,多样本数据增强方法利用多个样本来产生新的样本,下面介绍几种方法。

(1) SMOTE[1]

SMOTE即Synthetic Minority Over-sampling Technique方法,它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。

类不平衡现象是很常见的,它指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但由于没有学习到小样本的特征,实际分类效果就会很差。

SMOTE方法是基于插值的方法,它可以为小样本类合成新的样本,主要流程为:

第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;

第二步,对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:

第三步,重复以上的步骤,直到大、小样本数量平衡。

该方法的示意图如下。

在python中,SMOTE算法已经封装到了imbalanced-learn库中,如下图为算法实现的数据增强的实例,左图为原始数据特征空间图,右图为SMOTE算法处理后的特征空间图。

(2) SamplePairing[2]

SamplePairing方法的原理非常简单,从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。

经SamplePairing处理后可使训练集的规模从N扩增到N×N。实验结果表明,因SamplePairing数据增强操作可能引入不同标签的训练样本,导致在各数据集上使用SamplePairing训练的误差明显增加,而在验证集上误差则有较大幅度降低。

尽管SamplePairing思路简单,性能上提升效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。

(3) mixup[3]

mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据。

令(xn,yn)是插值生成的新数据,(xi,yi)和(xj,yj)是训练集随机选取的两个数据,则数据生成方式如下

λ的取值范围介于0到1。提出mixup方法的作者们做了丰富的实验,实验结果表明可以改进深度学习模型在ImageNet数据集、CIFAR数据集、语音数据集和表格数据集中的泛化误差,降低模型对已损坏标签的记忆,增强模型对对抗样本的鲁棒性和训练生成对抗网络的稳定性。

SMOTE,SamplePairing,mixup三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,不过所增加的样本点在特征空间中仍位于已知小样本点所围成的区域内。如果能够在给定范围之外适当插值,也许能实现更好的数据增强效果。

3 无监督的数据增强

无监督的数据增强方法包括两类:

(1) 通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN[4]。

(2) 通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment[5]。

3.1 GAN

关于GAN(generative adversarial networks),我们已经说的太多了。它包含两个网络,一个是生成网络,一个是对抗网络,基本原理如下:

(1) G是一个生成图片的网络,它接收随机的噪声z,通过噪声生成图片,记做G(z) 。

(2) D是一个判别网络,判别一张图片是不是“真实的”,即是真实的图片,还是由G生成的图片。

GAN的以假乱真能力就不多说了。

2 Autoaugmentation[5]

AutoAugment是Google提出的自动选择最优数据增强方案的研究,这是无监督数据增强的重要研究方向。它的基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,流程如下:

(1) 准备16个常用的数据增强操作。

(2) 从16个中选择5个操作,随机产生使用该操作的概率和相应的幅度,将其称为一个sub-policy,一共产生5个sub-polices。

(3) 对训练过程中每一个batch的图片,随机采用5个sub-polices操作中的一种。

(4) 通过模型在验证集上的泛化能力来反馈,使用的优化方法是增强学习方法。

(5) 经过80~100个epoch后网络开始学习到有效的sub-policies。

(6) 之后串接这5个sub-policies,然后再进行最后的训练。

总的来说,就是学习已有数据增强的组合策略,对于门牌数字识别等任务,研究表明剪切和平移等几何变换能够获得最佳效果。

北大青鸟设计培训:怎样才能提高Python运行效率?

python逐渐走入人们的视线,成为热门编程语言,随之而来,加入python培训的准程序员大军也成为社会热点。

Python具有许多其他编程语言不具备的优势,譬如能通过极少量代码完成许多操作,以及多进程,能够轻松支持多任务处理。

除了多种优势外,python也有不好的地方,运行较慢,下面电脑培训为大家介绍6个窍门,可以帮你提高python的运行效率。

1.在排序时使用键Python含有许多古老的排序规则,这些规则在你创建定制的排序方法时会占用很多时间,而这些排序方法运行时也会拖延程序实际的运行速度。

最佳的排序方法其实是尽可能多地使用键和内置的sort()方法。

2.交叉编译你的应用开发者有时会忘记计算机其实并不理解用来创建现代应用程序的编程语言。

计算机理解的是机器语言。

为了运行你的应用,你借助一个应用将你所编的人类可读的代码转换成机器可读的代码。

有时,你用一种诸如Python这样的语言编写应用,再以C++这样的语言运行你的应用,这在运行的角度来说,是可行的。

关键在于,你想你的应用完成什么事情,而你的主机系统能提供什么样的资源。

3.关键代码使用外部功能包Python简化了许多编程任务,但是对于一些时间敏感的任务,它的表现经常不尽人意。

使用C/C++或机器语言的外部功能包处理时间敏感任务,可以有效提高应用的运行效率。

这些功能包往往依附于特定的平台,因此你要根据自己所用的平台选择合适的功能包。

简而言之,这个窍门要你牺牲应用的可移植性以换取只有通过对底层主机的直接编程才能获得的运行效率。

4.针对循环的优化每一种编程语言都强调最优化的循环方案。

当使用Python时,你可以借助丰富的技巧让循环程序跑得更快。

然而,开发者们经常遗忘的一个技巧是:尽量避免在循环中访问变量的属性。

5.尝试多种编码方法每次创建应用时都使用同一种编码方法几乎无一例外会导致应用的运行效率不尽人意。

可以在程序分析时尝试一些试验性的办法。

譬如说,在处理字典中的数据项时,你既可以使用安全的方法,先确保数据项已经存在再进行更新,也可以直接对数据项进行更新,把不存在的数据项作为特例分开处理。

6.使用较新的Python版本你要保证自己的代码在新版本里还能运行。

你需要使用新的函数库才能体验新的Python版本,然后你需要在做出关键性的改动时检查自己的应用。

只有当你完成必要的修正之后,你才能体会新版本的不同。

图像处理和数据增强

前言:用CNN进行训练模型的时候,通常需要对图像进行处理,有时候也叫做数据增强,常见的图像处理的Python库:OpenCV、PIL、matplotlib、tensorflow等,这里用TensorFlow介绍图像处理的过程

进行图像的读取和解码,然后调用函数进行展示

结果如下:

图片的大小为:(512, 512, 3)

结果:

图片的大小为:(20, 20, 3)

注意:当放大时候,几乎图像不失真

上述为中间位置剪切或者填充,下面介绍任意位置剪切或者填充

这样就可以截取任意图像里面的内容了

下面的图像处理归结到数据增强里面了

当训练数据有限的时候,可以通过一些变换来从已有的训 练数据集中生成一些新的数据,来扩大训练数据。数据增强的方法有:

以水平面为对称轴如下:

转置,相当于矩阵的转置,90度转换

注意:颜色空间的转换必须讲image的值转换为float32类型,不能使用unit8类型

图像基本格式:

rgb(颜色)0-255,三个255为白色,转化为float32就是把区间变为0-1

hsv(h: 图像的色彩/色度,s:图像的饱和度,v:图像的亮度)

grab(灰度)

这样的方法,可以运用到车牌设别的过程中,对车牌自动进行截取。

高斯噪声、模糊处理

样本不均衡即有些类别图像特别多,有些特别少。类别不平衡数据的处理:Label shuffle

具体步骤如下图所示:

先按最多的类别进行随机抽取序号,组数为label的数目,然后对每个label中的样本书取模,然后分别对应自己序号的图像,最后得到的样本所有类别都一样多。

python可以做数据分析,好处是什么呢?怎么学习?

链接:

提取码:7234

炼数成金:Python数据分析。Python是一种面向对象、直译式计算机程序设计语言。也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。 Python语法简捷而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。

课程将从Python的基本使用方法开始,一步步讲解,从ETL到各种数据分析方法的使用,并结合实例,让学员能从中借鉴学习。

课程目录:

Python基础

Python的概览——Python的基本介绍、安装与基本语法、变量类型与运算符

了解Python流程控制——条件、循环语句与其他语句

常用函数——函数的定义与使用方法、主要内置函数的介绍

.....

优化Python编程的4个妙招

1. Pandas.apply() – 特征工程瑰宝

Pandas 库已经非常优化了,但是大部分人都没有发挥它的最大作用。想想它一般会用于数据科学项目中的哪些地方。一般首先能想到的就是特征工程,即用已有特征创造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函数。

在Pandas.apply()中,可以传递用户定义功能并将其应用到Pandas Series的所有数据点中。这个函数是Pandas库最好的扩展功能之一,它能根据所需条件分隔数据。之后便能将其有效应用到数据处理任务中。

2. Pandas.DataFrame.loc – Python数据操作绝妙技巧

所有和数据处理打交道的数据科学家(差不多所有人了!)都应该学会这个方法。

很多时候,数据科学家需要根据一些条件更新数据集中某列的某些值。Pandas.DataFrame.loc就是此类问题最优的解决方法。

3. Python函数向量化

另一种解决缓慢循环的方法就是将函数向量化。这意味着新建函数会应用于输入列表,并返回结果数组。在Python中使用向量化能至少迭代两次,从而加速计算。

事实上,这样不仅能加速代码运算,还能让代码更加简洁清晰。

4. Python多重处理

多重处理能使系统同时支持一个以上的处理器。

此处将数据处理分成多个任务,让它们各自独立运行。处理庞大的数据集时,即使是apply函数也显得有些迟缓。

关于优化Python编程的4个妙招,青藤小编就和您分享到这里了。如果您对python编程有浓厚的兴趣,希望这篇文章可以为您提供帮助。如果您还想了解更多关于python编程的技巧及素材等内容,可以点击本站的其他文章进行学习。