需要增强的原因:在训练神经网络的时候,需要大量的数据进行模型的训练,以防止模型的过拟合。
还可以怎么做:增加数据量通常会有两种方式,直接增加原始数据,做数据增强。
一些数据增强的方法:
①.图像翻转,是做镜像翻转
②.图像旋转,例如以90,180,270度旋转
③.图像缩放
④.随机剪裁,剪裁之后保留主要部分,但不要把含有主要特征的目标物体弄掉
⑤.物体平移
⑥.加入随机噪声,例如加入常见的椒盐噪声、高斯噪声
⑦.颜色变换,例如增强RGB中的某一个通道,另外的通道不变
⑧.改变对比度,在HSV颜色空间中,改变饱和度S和亮度V,保持色调H不变。
备注:数据增强也要选择最适合项目需求的方式,例如胶片分类项目中,图像翻转和随机剪裁和加入噪声等是比较合适的。
可以缓解梯度消失,因为inception结构额外计算了两个中间loss,防止了较深网络传播过程中的梯度消失问题。
L2正则化可以限制参数权重的过大变化,这种限制可以使得网络的变化不至于变得太多
其中:N为输出长宽,W为输入长宽,f为卷积核大小,p为padding大小,s为步长。
池化后的大小:N = (W - F)/S + 1
yoloV1:将原输入图划分为s*s个小格,每个小格有B个bounding box(文章中自己设置),需要检测的类别C,位置信息4个值,和置信度confidence,判断每个小bounding box的置信度,采用最大值抑制法,得到每个object的最终位置框和置信度和类别。这种方法识别速度较快,45fps到155fps。向量(5*B+C)
yoloV2:是V1的batter、faster、stronger版本,是目前比较先进的物体检测方法,速度够快,并且可以权衡精度和速度,结合ImageNet和COCO一起对分类和位置进行训练,实际上可识别种类是超过9k的,提出Wordtree对数据进行混合训练。
yoloV3:多尺度预测,就是采用不同大小的特征图来进行预测,最大的改动在于基础的分类网络采用类似于resnet的网络结构,另外放弃了softmax的分类,采用多个logistic分类器的组合,因为目标可能有重叠的标签,例如检测到一只狗,可以是犬类也可以是家畜。
https://blog.csdn.net/app_12062011/article/details/77554288
https://www.julyedu.com/question/big/kp_id/26/ques_id/2103
SSD在YOLO的基础上,加入了faster-rcnn的anchor思想,而且加入了在不同层的特征图张进行特征扫描,实现了不同尺度上的检测,保证了又YOLO的速度,加上了框选位置的精度。
https://www.jianshu.com/p/9018d08773e6
有效,这类滤波有类似于把物体边界突显出来的意思,还是可以看到整个物体,人眼是很容易分清楚的,我觉得深度学习本质要做的就是尽量把人眼能看出来的都把他识别出来,而如果数据增强之后还是一个不同表现形式的物体,那也可以一定程度的增强网络的泛化能力。
1.模型剪裁,这是目前最为简单有效的方法:计算卷积核参数绝对值的和,接近于0的就去掉。计算某个卷积核经过非线性之后,为零的就去掉,这种方法显示vgg有90+%的可以去掉,但实验只验证了一个卷积层和一个FC。基于熵值的计算判断。基于随机剪裁的判断。基于计算能量消耗的判断,能量消耗大的层去除一些卷积。
2.核的稀疏化进行压缩,在训练的时候进行对参数的限制,例如同时加入两项正则化,让得到的参数趋向于稀疏,或者说让不重要的链接截断。
3.权重共享,就是说如果一个组块里,有多个部分的权重的贡献是一致的,那就只使用一个部分,来替代整个组块。
4.基于量化的模型压缩,这个压缩的原理是训练之后大部分权重都是在0附近的,就用8位的类型来代表32位的浮点数,内存和带宽都缩小了,精度也低了。
5.基于知识蒸馏进行模型压缩:一个训练好的泛化能力比较好的大网络,一个是较为精简的没训练的压缩网络。主要操作有两种,一个是给小网络设定一个新的目标函数,包含hard target与soft target,一般选取的权重分别为0.1和0.9,hard target就是传统的loss,而soft target是小网络和大网络之间的加了温度参数T后的交叉熵,而的一个建议值是20 。第二个方式是把大网络截成三段,小网络也是,每一段的action输出进行对应的损失函数求取。
6.基于low-rank分解,这个还不是很懂。
https://blog.csdn.net/App_12062011/article/details/81665140
http://www.cnblogs.com/maybe2030/p/5678387.html
https://blog.csdn.net/Taiyang625/article/details/81672717
CNN用来分类和物体检测之类的,延伸出来风格迁移,对抗网络,域对抗网络,包括物体检测的RCNN、YOLO等,还有文字语音方面的RNN,RNN又延伸出LSTM,2017又提出了胶囊网络,输出不再是一个个的值,而是一个个的向量,但是这个在工业届还没广泛应用起来。
Lenet:1998,用于邮件的数字识别
AlexNet:2012,开始作用于彩色图,使用relu
VGG16:2014,牛津,采用卷积层与池化层交替,三个FC,卷积核都采用3*3,池化都采用2*2
inception V1:2014,由若干个GoogleNet组成,每个模块有卷积核分别为1、3、5的小卷积层和2*2池化层组成,额外插入两个中间loss的计算,防止训练时出现梯度消失之类的问题。
inception V2:在V1的基础上,把5*5的卷积拆分为两个3*3的卷积,首次加入了BN操作,整体来说感受野不变,训练加快约为V1 的1/14,准确度上限也提高了。
inception V3:增加了卷积的类别,7*7之类的,然后又把3*3的卷积拆分成1*3和3*1,一些卷积的特征图缩小采用了步幅为2的方式,而不是传统的池化层。(inception模块里面的pool并不缩小图片)
inception V4:尝试了resnet的链接结构,也取得了成功。
ResNet:2015,微软亚洲研究院,首次采用了跳接的方式进行网络链接,网络深度加深了很多。
以上都是一般用于图片分类,例如lenet用在数字分类,其他的用在其他物体分类,猫狗分类等。另外还有一些网络结构用于物体识别,例如R-CNN、YOLO、SSD等等。
2014.R-CNN的思想是选出若干个预测框,对预测框先统一进行一下NN,然后进行两大操作,一个是用SVM进行物体分类(当时SVM的工程应用效果还相对更好),如果有C类就分出包括背景的C+1类。另一个是对位置区域框回归得到更贴近准确位置的位置框。这个原始的模型单张检测用时达47s。
2015.Fast R -CNN在原来基础上做了改进,不再是划分出预测框再进行操作,而是统一先做卷积层操作,再划分出相应的预测框对应位置,物体分类用softmax来做,然后把位置和分类的loss合在一起形成端对端系统,对于不同大小的预测框要进入固定的FC,是通过RIP池化来操作的。最终这个版本提速到了0.32s(另外一个说法是2S)。
而2015.Faster R-CNN是对原始的预测框的选取也放进了卷积层操作,卷积层之后再分出一条路来做预测框的选取,另外就是把FC层换成了1*1卷积层,最终速度进一步提高了,0.2s。
语义分割是对每个像素点都要输出结果,判断每个像素点属于哪一类。语义分割的核心思想是进行全卷积网络操作,输出的层长宽是等于输入的图,通道数的等于类别数加一,每个像素点对应一个1*X的向量,来表示该点属于什么类。实际网络中不可以保持网络宽度一直不变,因为这样的话计算消耗会非常的大,因此需要做成沙漏形,往中间缩小,然后后面通过反卷积进行长宽的扩大。最终得到原图大小的输出层。
一个数据集一轮可以若干次的梯度下降;
单次迭代因为还是进行矩阵运算,因此速度不会降低太多;
cost function会变成随机下降,还是会下降,而且有利于跳过一些局部最小值。
损失函数的选择是否是合适的
学习率的选取是否合适
batch size选择是否合适
训练样本是否正常,是否需要增强
是否有设置batch normlaztion
激活函数的类型需要选取恰当
选取合适的优化算法(例如梯度下降,Adam等)
是否存在过拟合
早停法,当网络训练到了最平衡的时候,停止训练
进行dropout操作,缓解过拟合
加入正则化
进行权重衰减,越训练到后期变化的幅度越小
改善训练集,寻找更多数据或者数据增强
寻找更合适的网络结构
1. 重新设计网络模型
2. 使用 ReLU 激活函数
3. 使用长短期记忆网络(或者说使用resnet)
4. 使用梯度截断(Gradient Clipping)
5. 使用权重正则化(Weight Regularization)
6. 加入BN层
1.使用了relu的激活函数,一定程度解决了梯度弥散问题
2.使用了最大池化操作,以前一般是使用平均池化,这个最大池化更加突出了特征
3.使用了dropout,这个一般是应用在卷积层后面的全连接层
4.使用了LRN,这个简单来说就是把大的变得更大,把小的变得更小,不过后来证明这个实际作用并不大,后来就弃用了
5.使用了GPU训练的操作方式,使得训练更多更快
6.使用了数据增强的方式进行处理,例如图像翻转旋转之列,使得训练集有更多的数据