深度学习中 number of training epochs 中的,epoch 到底指什么?
首先复习下神经网络的概念。 神经网络由一些相互链接的“神经元”组成。每个“神经元”有相应的权重。 神经网络的神奇之处就在于权重是通过训练自动得出的。所谓训练,就是让神经网络在训练 数据集上跑一遍,看看损失函数的值怎么样。如果损失函数的值足够小,小到符合我们的需 求,那就说明神经网络拟合得很好了,训练大功告成了(实际上并非如此,因为仅仅知道拟 合得很好并不够,我们还要知道神经网络是不是拟合得太好了,也就是过拟合。所以还需要 用测试数据集来测试是否过拟合。不过这里就姑且就当训练完成了把。)反之,如果损失函 数的值不够小,那就还需要继续训练。 神经网络在训练数据集上跑一遍,称为一次迭代(iteration)。 那么 epoch 又是怎么回事? 我们知道,简单来说,深度学习就是很深很深的神经网络(这一说法并不准确,但姑且 让我们这么说),也就是说,有很多层,每层可能有很多神经元,结构也可能比较复杂。然 后相应的,数据集也可能比较大。那跑一遍(迭代)会比较慢。所以人们就想出了一个变通 的办法,就是每次只使用数据集中的部分样本,这个数目就称为 batch size。 虽然只使用了部分样本,但很多时候已经足以优化权重,降低损失函数了。这样训练效率高 很多,训练时间也能缩短不少。 不过这样一来,一次迭代就不一定完整跑遍数据集中的所有样本了。那在比较的时候, 就不太方便直接比较迭代次数了。 比如,假设深度神经网络 A 经过 32 次迭代损失函数的值足够低了,而深度神经网络 B 经过 16 次迭代损失函数的值足够低了,但实际上,A 的 batch size 可能是 256,而 B 的 batch size 可能是 2048。所以直接比较 A 和 B 的迭代次数并没有什么意义。 所以就又提出了 epoch 这个概念,指数据集中的所有样本都跑过一遍。 那对于每次迭代都跑遍数据集中的样本的情况,epoch 和迭代是一样的。否则的话, epoch 就要换算。上面的例子中,假设数据集的样本总数是 4096,那 A 的 1 个 epoch 就需 要 16 次迭代,而 B 的 1 个 epoch 只需要 2 次。也就是说,A 经过 2 个 epoch 就训练好了, 而 B 需要 8 个 epoch。
参考-------http://www.360doc.com/content/18/0417/18/47852988_746429309.shtml-------
工程化开发
1.拿到深度学习项目需要考虑些什么?
- DL or ML?
- DL比机器学习特征提取强
- 分析目前的问题
- 分析当前数据,现在可用的数据是什么样的(高维的数据?图片?音频?语料?),数据的维度是高维的还是低维的?数据的类型表明了解决方案的类型即第五条
- 解决方案属于哪类典型问题(分类?回归?)
图片数据的处理(获取数据、分析数据) - 尽可能多的获取数据
- 观察数据的分布,是否存在分布不均匀
- 观察数据的质量,是否有明显的标签错误,是否有大量人类都无法识别的图片
- 数据是否需要进行标准化
- 标注数据使用什么软件
- 标注还在
选择模型、模型调优
- 确定问题目标:图片分类?目标检测?实例分割?
- 确定主要约束条件:求准还是求快?在Server还是在嵌入式设备?算力如何?内存是否足够?
- 目前已经是最好效果了吗?还是可以再一进步提高精度?过高的训练精度是否是过拟合了?过高的预测精度是不是会导致泛化能力不足?
●上线效果
●从系统吐出的错误中查找问题
●人脸识别问题。总不能识别的场景。灯光太强?太暗?人脸不正?
●图片分类问题。把分类错误的图片收集到,仔细观察图片,看是不是标签了?过于模糊? .
●目标检测问题。某些物体总是识别不出来。是不是目标太小了,太大了,太长了?
2.1数据预处理
去掉错误数据,采集数据通常可能采集回来错误的值,人工标注也容易标注错误,宁肯漏标也不要错标,去除有争议的数据(猫和hello kitty的对比),人类也无法处理的数据(有些图像的预测概率在0.5-0.6之间,理论上可能是这个图像表现出不止一个类别,所以模型给他们分配了相同的概率),训练的时候尽量多选择特征明显的图片,偶尔加入一些不好分类的图片也可以。如果数据集中大部分数据都是肉眼都不好分类的图片的话,模型训练的效果应该就是不好的。
2.2数据扩充
为什要数据扩充,就是数据量不够。
数据是深度学习的粮食
数据量不够—数据增强
数据分布不均衡----数据均衡
2.2.1简单的数据扩充方式
1.水平翻转(horizontally flipping):会使原数据集扩充-倍。
2.随机抠取(random crops): -般用较大(约0.8-0.9倍原图大小)的正方形在原图随机位置抠取图像(image patch/crop),每张图像抠取的次数决定了数据集扩充的倍数。
3.旋转(rotating):将原图旋转一-定角度(-30°, 30°), 将经旋转变换后的图像作为扩充的训练样本加入原训练集。
4.色彩抖动(color jittering):在RGB颜色空间对原有RGB色彩分布进行轻微的扰动,或在HSV颜色控件随机改变原有图像饱和度和明度或对色调进行微调。
在实践中,往往会将上述几种方式叠加使用。如此,便可将图像数据扩充至原有数量的数倍甚至数十倍。
5.色彩抖动的其他预处理
●当我们获取了足够的训练样本后,在训练前,还有些操作是必不可少的一步。
●比如:减均值操作。
●具体这样操作:计算数据集的像素均值,然后让训练集、验证集、测试集分别减去该均值。
●减均值操作的原理是,我们默认自然图象是一类平稳的数据分布,此时从每个样本.上减去数据的统计平均值可以移除共同部分,凸显个体差异。
2.2.2其他的数据预处理方法
●对输入特征做归一化处理(normal ization)也是常见的预处理操作,同样在图像处理中可以将图像的每个像素信息看作–种特征。
●在实践中,对每个特征减去平均值来中心化数据的归- -化处理方式称为“中心式归一化”(mean normal ization)。
●需要注意的是,实际操作中应首先划分好训练集,验证集和测试集,该均值仅针对划分后的训练集计算,不可再未划分的所有图上计算,如此会违背机器学习的基本原理,即“在模型训练过程中能且仅能从训练集中获取信息”。
样本不均衡的弊端
●经典算法通常假设各类数据是均衡(平衡)的,即每个类别的样本数量是-样多的●然而,实际工程多数情况样本是不均衡的
●不均衡导致泛化能力弱:
●训练出的模型只会重视样本多的类别
●轻视样本少数的类别
●比喻:
●上高中偏科,总数学,偶尔学英语
●高考的时候英语也是要考的
●极端的例子:
●二分类问题:训练集中,正例( 99个少, 负例:/1个
●分类器只要放弃负例的预测就可以获得99%的正确率●二分类问题:训练集中,正例: 1个,负例: 99个
●分类器只有1%的正确率,这个分类器没法用
样本不均衡的应对—把数据数量拉平
●样本数量过少的想办法扩充数量(_上采样)
●直接复制类别较少的图片
●数据扩充的方式
●样本数量过多的想办法减少数量(下采样)
●有针对性的挑选图片进行训练
下采样
下采样不是丢弃图片(数据是宝贵的资源,仍数据就像扔钱)
正例和负例的比例为5:1
那么不是简单的丢弃4张正例,使得图片比例变为1:1而是每轮训练的时候从5个中随机抽取一张猫,多轮训练
迁移学习
Layer Normalization 与Batch Normalization的区别:LN是在输入神经元之前就计算了均值和方差,BN是对同一批的数据计算均值和方差。
简单的来说就是BN和LN进行处理的方向不同。对于BN来说,batch_size大小不同,那么它对应的BN出来的mean和std都是变化的,上图中batch_size=3,均值是mean=3,std=3(第0维度),当batch_size不是3的时候,那么均值和方差就会改变;而LN随着batch_size的不同对应单条样本的均值和方差不同——————BN对batch比较敏感,batch_size不能太小;LN则是独立于batch_size的———就可以这么理解。参考:关于batch normalization和layer normalization的理解
如果前面有学过Batch Normalization,则会发现其实Layer Normalization并没有什么新奇的地方,只是两者计算均值和标准差的对象不一样。最后还是总结一下:
Layer Normalization可以提高模型的训练速度和精度,使得模型更加稳健。
Layer Normalization可以适用于单样本的情况,在RNN中效果比Batch Normalization更优。
参考:Layer Normalization原理介绍