面试总结

YOLOv3介绍:

Yolov3采用darknet53作为backbone,并从3个不同的尺度上提取了特征。通过在COCO数据集上聚类得到9个不同的anchor, 每个尺度分配了3个anhor。预测时, 在每个尺度上将图像分为s*s个格子,每个格子的每个anchor都会预测边界,前景概率和各个类别的概率。

损失:边框是均方差损失,置信度是二分类交叉熵损失,类别损失是二分类交叉熵损失,可以解决互相有遮挡的情况

 

我们对YOLOv3的改进

先介绍YOLOv3

Kmeans:首先,样本图片resize到416*416,然后获取所有样本的的width和height。根据样本距离聚类中心的距离(用1-IOU计算样本与聚类中心的距离。),重新设置样本的类别。对于每一个类,用该类的样本的均值计算该类的质心。共聚类出来了6个长方形的anchor 最小10*30  最大的63*170 而不像原Anchor 大至300+.

Kmeans的k值是通过可视化观察w,h,感觉3个比较合适,来选定的。

去掉13*13feature map:根据聚类的anchor来决定去掉最后一个feature map的检测: 416*416 的话从darknet53出来有32倍,16倍,8倍下采样,预测使用的特征图大小为13*13 、26*26、52*52,但是anchor尺寸明显用不到13*13的大物体预测(原来的13*13的特征图的anchor为116,90,  156,198,  373,326)。如果要预测,还得对13*13进行两次上采样,可能还会加入噪声,在一些草地工地,还会出现大box。干脆直接要去掉最大的yolo层。

加入Focal loss来区分挖掘机和吊车:作者将类别不平衡作为阻碍one-stage方法超过top-performing的two-stage方法的主要原因。为了解决这个问题,作者提出了focal loss,在交叉熵里面用一个调整项,为了将学习专注于hard examples上面,并且降低大量的easy negatives的权值。

正负样本的平衡:设置正负样本的权重

 

难易分类样本的权重:减少容易分类的样本的权重,使得模型在训练时更专注于难分类的样本

 

当一个样本被分错的时候,pt是很小的,那么调制因子(1-Pt)接近1,损失不被影响;当Pt→1,因子(1-Pt)接近0,那么分的比较好的(well-classified)样本的权值就被调低了。

 

参数值的选择:当γ=0的时候,focal loss就是传统的交叉熵损失,当γ增加的时候,调制系数也会增加。 专注参数γ平滑地调节了易分样本调低权值的比例。γ增大能增强调制因子的影响,实验发现γ取2最好。在实验中a的选择范围也很广,一般而言当γ增加的时候,a需要减小一点(实验中γ=2,a=0.25的效果最好)。RetinaNet:Resnet+FPN(特征金字塔网络)+FCN(分别用于分类和回归)

 

OHEM(online hard example mining):OHEM算法虽然增加了错分类样本的权重,但是OHEM算法忽略了容易分类的样本。将所有sample根据当前loss排序,选出loss最大的N个,只计算被选样sample的loss,其余的抛弃。而Focal loss则使用了全部的样本。二阶段分类器Faster RCNN由于region proposal过滤掉了大部分的样本,只提取了少量的候选框。

 

YOLOv3的网络架构图:

 

DeepLab系列

Deeplab v1:提出空洞卷积,并利用CRF优化预测结果。

Deeplab v2:提出ASPP

Deeplab v3:改进了ASPP,加入了image pooling和1*1 conv

 

CRF:

CRF的效果:CRF通过两个像素间实际相对距离与两个像素的值来得到两个像素间的差距。CRF鼓励给差距小的像素分配相同的标签,给相差较大的像素分配不同的标签。这样CRF就能使图片尽量在边界处分割。

感受野计算:

 

PSPNet:

介绍::PSPNet提出卷积操作并不能获得理论上的感受野,所以使用自适应池化和金字塔池化模块来获取不同尺度,不同感受野的特征图。首先,输入图片经过ResNet后得到下采样8倍的特征图,然后,使用自适应池化和金字塔池化分别得到1*1,2*2,3*3,6*6分辨率的特征图,然后将他们都使用双线性插值上采样到1/8原图大小的特征图,并于backbone中对应特征图做concat后来做预测。

 

RefineNet

Non-local(非局部特征,long-range特征):

解释:一层卷积提取的特征很local,为了达到non-local的效果,一般是不断叠加使用多层卷积以获得更大的感受野。但是,这会带来计算量和优化难度的增加。因此提出一个基础单元non-local module,通过该module,可以获得长距离的像素之间的依赖,对图像中每个像素,都计算整张图像的其他所有像素对该像素响应的加权和,

Non-local与全卷积操作的不同:non-local中输入特征图可以任意大小,输出特征图和输入特征图一样大;non-local module可以在卷积层中任意添加。Non-local computes reponse based on relationships between different locations, but fc use local weights.(Nonlocal会计算响应,而fc使用学到的权重)

为了提高non-local block的计算效率,作者做了两个优化::1、θ、φ和g操作的卷积核数量设定为输入feature map通道数的一半(Figure2中512对1024)。2、对φ和g输出采取pooling方式进行抽样,这样φ和g输出的feature map的size就减小为原来的一半。

Non-local为什么不是对网络的每个block都会引入?non-local机制是为了获取全局信息,而原来的卷积操作时为了获得局部信息,二者要融合。

提出的公式:

参考:https://zhuanlan.zhihu.com/p/77834369

Here i is the index of an output position (in space, time, or spacetime) whose response is to be computed and j is the index that enumerates all possible positions. x is the input signal (image, sequence, video; often their features) and y is the output signal of the same size as x. A pairwise function f computes a scalar (representing relationship such as affinity) between i and all j. The unary function g computes a representation of the input signal at the position j. The response is normalized by a factor C(x).

PSANet:

PSANet介绍:PSANet是网络的一个模块,通过该模块,特征图上的每个点通过自适应的注意力掩码(self-adaptive learned attention mask)与特征图上的其他所有的点建立关系。用双向的信息传递来帮助场景理解:搜集其他位置的信息来帮助理解当前位置,并把当前位置的信息分发出去。像素点之间的关系与两个像素的像素值和像素间位置有关。

公式推理:

1.在位置i处的新的特征z应该是原特征图中所有与位置i处的像素相关的像素的特征的加权和。这个权重是什么?可以通过学习,或者指定+学习的方式得到。

2.为了方便计算,采用近似方法

3.通过设计网络用学习的方法来获得权重

4.PSANet模块在网络中的位置

DANet,OCNet,Nonlocal:

DANet:

OCNet:参考https://zhangbin0917.github.io/2018/09/13/OCNet-Object-Context-Network-for-Scene-Parsing/

Faster RCNN系列:

介绍

RCNN:

Fast RCNN的ROI Pooling:

介绍:输入特征图尺寸不固定,通过ROI Pooling后输出特征图尺寸固定;

ROI Pooling的输入:1. 特征图:指的是图1中所示的特征图,在Fast RCNN中,它位于RoI Pooling之前,在Faster RCNN中,它是与RPN共享那个特征图,通常我们常常称之为“share_conv”;

2. ROI:在Fast RCNN中,指的是Selective Search的输出;在Faster RCNN中指的是RPN的输出,一堆矩形候选框框,

ROI pooling作用:(1)用于目标检测任务;(2)允许我们对CNN中的feature map进行reuse;(3)可以显著加速training和testing速度;(4)允许end-to-end的形式训练目标检测系统

Faster RCNN:

Faster RCNN其实可以分为4个主要内容:

  1. Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  3. Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  4. Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

 

SSD:

1.概述:

SSD是单点多尺度检测,对6个特征图上的每一个cell都用4-6个anchor进行检测,检测非常密集。SSD结合了faster RCNN和YOLO。它沿用了YOLO中直接回归 bbox和分类概率的方法,同时又参考了Faster R-CNN,大量使用anchor来提升识别准确度。它利用了多层网络特征,而不仅仅是FC7。SSD的anchor不是每个位置的精调,是跟YOLO一样画网格,然后在网格上产生anchor。

 

2.SSD的anchor(default box,建议框,先验框,proposal框,锚点)的计算:

在多尺度特征图上用多个anchor框做检测:大尺度的feature map用小的anchor框,负责检测较小的物体;小尺度的feature map用大的anchor框,负责检测较大的物体,在6个特征图上做预测,每个feature map上用4-6个anchor框。anchor框的大小不是根据经验假设的(Faster RCNN的anchor是经验大小),而是通过计算得到的。

SSD的anchor是计算得到的,假设SSD的输入原图的尺寸是300*300,我们希望在['conv4_3', 'fc7', 'conv6_2', 'conv7_2', 'conv8_2', 'conv9_2'] 这6个层的特征图中用不同的anchor回归和分类。这6个层的特征图分辨率分别为[38*38,19*19,10*10,5*5,3*3,1*1]. ,对于每层feature map的每个cell的每个anchor都用3*3的卷积回归和分类。  我们通过计算指定各个层的feature map的要检测的目标的scale和ratio,准则是底层特征图检测小目标,高层特征图检测大目标。在conv4_3层上,anchor有4个,大小为(21*21,√(21*45)*√(21*45),√(21*0.5)*√(21*2),√(21*2)*√(21*0.5))。其他层的anchor可能有4或6个,对应于文章中的解释为:

Anchor_step=[8,16,32,64,100,300]表示在6个不同层的feature_map没移动一个cell时,相当于在原图中移动了多少个像素。38*38的feature map的一个cell对应原图的8个像素

我们知道了anchor的在原图中的中心和anchor在原图上对应的大小,既可以计算该anchor于ground_truth的IOU

3.损失函数

只有正样本参与定位损失的计算和物体类别损失的计算。预测的正样本定义:预测类别与实际类别一致,且预测的边界框与ground_truth的边界框的IOU大于60%。

负样本只计算前景/背景的类别损失:预测的边界框与ground_truth的边界框小于30%。

难例挖掘:在负样本中选择前景置信度最高的样本(这些样本与groud_truth的IOU小于30%,是负样本,但是前景概率大,所以是难例)

4.网络结构

在要预测的各层feature_map中,对每个cell的每个anchor都使用3*3的卷积输出坐标回归值和置信度。这样就做到了6个feature_map上对每个cell的每个anchor做预测(预测包括4个坐标回归和类别置信度)

几个点:

1.SSD在多个feature map上做预测      2.SSD在每个feature map的每个cell上都会用4-6个anchor做预测,预测会输出回归的坐标,前景概率,类别概率    3.SSD中没有使用全连接,而是用卷积输出后,将结果flatten(用3*3的卷积+flatten代替全连接)。

 

预测过程,会在所选取的特征图进行两组 3x3卷积,其中一组输出每个默认框的位置(x, y, w, h)四个值,另一组卷积层输出每个默认框检测到不同类别物体的概率,输出个数为预测类别个数。再将所有的默认框位置整合为mbox_loc,将所有默认框预测类别的向量组合为mbox_conf。

 

 

SSD的anchor机制的原理:

假设某feature map上用4个anchor预测,则该feature map的每个cell都会用4个anchor分别预测前景概率,各类别概率和边框回归值。其中,这些值的ground_truth是根据这个cell的这个anchor与实际标注的框的IOU来得到的,比如IOU>60%时,该anchor的前景概率为1,类别为实际类别,边框回归需要计算得到。anchor并不是实际存在的,也不是用来从特征图中截取特征的。anchor是设定好以后,则feature map上的每个cell的要预测的值的真值是确定的(根据该cell的位置、该cell所用的anchor与实际标注框计算得到),然后网络的拟合目标就是这些真值。

 

Faster RCNN & Yolo & SSD区别:

faster RCNN(看前面的介绍)

最初从RCNN发展而来,RCNN->fast RCNN->faster RCNN,那么简单的介绍下前两种算法。

首先RCNN,在这个算法中神经网络实际上就是一个特征提取器,作者用selective search的方法提取了一定数量(2000个)region proposal,然后对region proposal做卷积操作,将fc7这一层的特征提取出来用于分类和坐标回归,这里分类用的还不是softmax而是SVM。这个算法的贡献主要是提出了一种有效的特征利用方式,后续很多人在工程实践中都是用的fc7层的特征来做基于faster RCNN的应用。

到fast RCNN,fast RCNN将除了region proposal提取以外的部分都用一个网络来实现,RCNN不同的是,1)他的分类和坐标回归的loss一起通过反向传播来更新网络参数;2)它在提取feature时并不会把每个region proposal都放入提取,而是将整幅图提取特征后,用坐标映射的方式提取feature,这样有两个好处a)快,因为一张图片只走一次网络;b)feature的特征受感受野的影响,能融合相邻的背景的特征,这样“看”得更远一些。

最后是faster RCNN,作者发现selective search的方法导致算法没有实时性的可能,因此,作者尝试用region proposal network来取代selective search的方法,并且与fast RCNN的分类和回归网络共用特征提取层,因此这样并不会带来太多额外的计算量,而实验结果也表明了,作者这样做确实提高的速度,并且还提高了准确率。因此,综上所述,region proposal network是faster RCNN的精华所在,也是精度高于以及速度慢于后续YOLO和SSD算法的原因。

YOLO

之前faster RCNN是先分两步,先提取region proposal,也就是判断是前景还是背景的问题,之后再分类,具体看前景是什么东西。而YOLO直接通过regression一次既产生坐标,又产生每种类别的概率。

YOLO的特点在于快,其中一方面来源于regression机制,还有一个原因就在于anchor机制了。YOLO中粗暴地分成了7X7的网格,每个位置默认可能属于2个object,那么事实上就是提取了98个region proposal,YOLOv3是更多的anchor,但是而faster RCNN是一种滑动窗口机制,每个feature map上都回归出9个anchor,大约一共20k个anchor,在通过非极大值抑制等方法最终会得到300个region proposal,并且Faster RCNN的候选框通过回归边界来精修。因此,faster RCNN候选框更多更准,效果好但速度慢。

SSD

SSD结合了faster RCNN和YOLO。它沿用了YOLO中直接回归 bbox和分类概率的方法,同时又参考了Faster R-CNN,大量使用anchor来提升识别准确度。它利用了多层网络特征,而不仅仅是FC7。SSD的anchor不是每个位置的精调,是跟YOLO一样画网格,然后在网格上产生anchor,由于利用了多层特征,anchor的scale每层都不同,因此产生了较多的超参数,增加了训练难度。

所以说,三种算法在实际应用中faster RCNN鲁棒性会可能会强一些,但是速度也会较慢。

Yolo v3SSD区别:、

SSDloss中,不同类别的分类器是softmax,最终检测目标的类别只能是一类。而在yolo-v3中,例如对于80类的coco数据集,对于类别进行判断是80个logistic分类器,只要输出大于设置的阈值,则都是物体的类别,物体同时可以属于多类,例如一个物体同时是person和woman。

Backbone network。ssd原版的基础网络就是VGG19,也可以用mobile-net、resnet等。yolo-v3的基础网络是作者自己设计的darknet-53(因为具有53个卷积层),借鉴了resnet的shortcut层,根据作者的话,以更少的参数、更少的计算量实现了接近的效果。

Anchor boxssd从faster-rcnn中吸收了这一思想,采用的是均匀地将不同尺寸的default box分配到不同尺度的feature map上。例如6feature map的尺度,default box的大小从20%90%的占比,同时有aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] ,最终可以计算出不同default box大小。而yolo-v3延续了yolo-v2的方法:从coco数据集中对bouding box 的(width, height)进行聚类,作者聚出9类,每类中心点取出作为一个box_size, 将每三个box_size划分给一个feature map。例如总共有10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326共9组w,h, 作者将后三个116,90,  156,198,  373,326作为13 * 13 的gird cell上的anchor box size。

图片输入。yolo-v3将输入图片映射到第一层feature map的固定比例是32。对于输入为416 * 416的图片,第一层feature map 大小为13 * 13。但是yolo-v3支持从300到600的所有32的倍数的输入。例如输入图片为320 * 320,这样第一层feature map就为10 * 10,在这样的gird cell中同样可以进行predict和match groudtruth。

Bounding Box 的预测方法。在不同的gird cell上,SSD预测出每个box相对于default box的位置偏移和宽高值。yolo-v3的作者觉得这样刚开始训练的时候,预测会很不稳定。因为位置偏移值在float的范围内都有可能,出现一个很大的值的话,位置都超出图片范围了,都是完全无效的预测了。所以yolov3的作者对于这位置偏移值都再做一个sigmoid激活,将范围缩为0-1 。b_x和b_y的值在(cell_x_loc, cell_x_loc+1), (cell_y_loc, cell_y_loc+1)之间波动。

 

 

CNN知识

过拟合与欠拟合

介绍:训练集和测试集上模型的效果

降低过拟合:数据增强,降低模型复杂度,权值约束(即正则化),集成学习(dropout,随机森林),提取终止

降低欠拟合:增加新的特征,增加模型复杂度,减少正则化

 

加速训练的方法:优化网络结构,减少参数规模,选择合适的优化算法,使用batch normalization.使用GPU加速,使用数据并行和模型并行

优化算法

SGD(小批量梯度下降):

加大的batchsize能带来更精确的梯度估计,较小的batchsize能带来更好的泛化误差。

SGD可能陷入局部极值点,峡谷(来回震荡)和鞍点。

 

 

Momentum动量方法:

加入了历史梯度的指数加权平均)。一般B的取值为0.9,相当于计算10个前面梯度的指数加权平均值。

 

参考:https://www.cnblogs.com/jiaxblog/p/9695042.html

NAG算法:

 

在计算参数的梯度时,使用的是未来位置的梯度(先按照梯度向前走一小步得到超前点,然后利用该点的梯度值与前面梯度的指数加权平均梯度合并后,用该梯度来跟新当前参数)。

自适应学习率算法(不同参数的学习率不同):

Adagrad:

对模型的每个参数计算不同的学习率,在梯度平缓的方向上取得更大的梯度(梯度平缓,历史平方和小,取倒数后会比较大),而在梯度陡峭的方向上变得平缓。但是,学习率单调递减,在后期会过小。

RMSProp:

为了解决Adagrad中学习率衰减,后期过小的问题,RMSProp使用不计算全部的历史梯度的平方和,而是通过指数加权平均只计算一段时间窗口内的梯度平方和。该公式可以参考Momentum,相当于将Momentum的一阶动量替换为二阶动量

 

Adam:

Adam 通过计算梯度的一阶动量的指数加权平均(做分子)和二阶动量的指数加权平均(做分母)而为不同的参数设计独立的自适应性学习率。

参考:https://zhuanlan.zhihu.com/p/32626442

Adam是较好的选择,SGD训练慢,但是可以达到极小值

二阶梯度优化算法:

牛顿法:牛顿法使用了一阶导数(斜率)和二阶导数(斜率的变化率,即曲线的弯曲程度)用二次曲面取拟合所处位置的局部曲面。牛顿法比梯度下降法收敛速度更快,因为牛顿法在选择方向时考虑了坡度是否够大和走了一步后坡度是否更大,看的更远,少走弯路。但是牛顿法每一步都要求目标函数的Hessian矩阵的逆,计算复杂。

拟牛顿法:用正定矩阵来近似Hessian的逆,简化运算。

https://www.cnblogs.com/jiahenhe2/archive/2017/12/21/8080563.html

初始化方法

参数初始化的目的:为了让神经网络在训练时学到有用的信息,需要参数更新时的梯度不为0.为了使经过多层网络后,信号不被过度方法或者减弱,应尽量保持每个神经元的输入输出方差一致。

全零初始化问题:会使得前向传播时所有神经元的输出值都为0,导致反向传播时不同维度的参数更新时相同的,所以不可以为0.

初始化方式:

Pre-training

Xavier 初始化:为了避免梯度消失或爆炸,参数初始化时有两个经验准测,每一层神经元激活值的均值为0,每一层神经元输入输出的方差一致。权重w的分布要满足:均值为0,方差不变(https://blog.csdn.net/shuzfan/article/details/51338178)。对应的初始化为均匀分

参考:https://zhuanlan.zhihu.com/p/32626442

Adam是较好的选择,SGD训练慢,但是可以达到极小值

二阶梯度优化算法:

牛顿法:牛顿法使用了一阶导数(斜率)和二阶导数(斜率的变化率,即曲线的弯曲程度)用二次曲面取拟合所处位置的局部曲面。牛顿法比梯度下降法收敛速度更快,因为牛顿法在选择方向时考虑了坡度是否够大和走了一步后坡度是否更大,看的更远,少走弯路。但是牛顿法每一步都要求目标函数的Hessian矩阵的逆,计算复杂。

拟牛顿法:用正定矩阵来近似Hessian的逆,简化运算。

https://www.cnblogs.com/jiahenhe2/archive/2017/12/21/8080563.html

初始化方法

参数初始化的目的:为了让神经网络在训练时学到有用的信息,需要参数更新时的梯度不为0.为了使经过多层网络后,信号不被过度方法或者减弱,应尽量保持每个神经元的输入输出方差一致。

全零初始化问题:会使得前向传播时所有神经元的输出值都为0,导致反向传播时不同维度的参数更新时相同的,所以不可以为0.

初始化方式:

Pre-training

Xavier 初始化:为了避免梯度消失或爆炸,参数初始化时有两个经验准测,每一层神经元激活值的均值为0,每一层神经元输入输出的方差一致。权重w的分布要满足:均值为0,方差不变(https://blog.csdn.net/shuzfan/article/details/51338178)。对应的初始化为均匀分

参考:https://zhuanlan.zhihu.com/p/32626442

Adam是较好的选择,SGD训练慢,但是可以达到极小值

二阶梯度优化算法:

牛顿法:牛顿法使用了一阶导数(斜率)和二阶导数(斜率的变化率,即曲线的弯曲程度)用二次曲面取拟合所处位置的局部曲面。牛顿法比梯度下降法收敛速度更快,因为牛顿法在选择方向时考虑了坡度是否够大和走了一步后坡度是否更大,看的更远,少走弯路。但是牛顿法每一步都要求目标函数的Hessian矩阵的逆,计算复杂。

拟牛顿法:用正定矩阵来近似Hessian的逆,简化运算。

https://www.cnblogs.com/jiahenhe2/archive/2017/12/21/8080563.html

初始化方法

参数初始化的目的:为了让神经网络在训练时学到有用的信息,需要参数更新时的梯度不为0.为了使经过多层网络后,信号不被过度方法或者减弱,应尽量保持每个神经元的输入输出方差一致。

全零初始化问题:会使得前向传播时所有神经元的输出值都为0,导致反向传播时不同维度的参数更新时相同的,所以不可以为0.

初始化方式:

Pre-training

Xavier 初始化:为了避免梯度消失或爆炸,参数初始化时有两个经验准测,每一层神经元激活值的均值为0,每一层神经元输入输出的方差一致。权重w的分布要满足:均值为0,方差不变(https://blog.csdn.net/shuzfan/article/details/51338178)。对应的初始化为均匀分或者正态分布

He初始化(MSRA初始化):Xavier的假设条件是激活函数关于0对称,是基于tanh作为激活函数推导的,而relu激活函数不满足该条件

 

正则化方法

BN:

神经网络中数据的网络维度为(N,C,H,W),其中N为batchsize,C为通道数

BN层:对N*(H*W)做统计,得到均值和方差,然后做Normalization.然后,引入r,B来重构变换(因为Normalization破坏了学习到的特征分布)

作用:加速训练,允许较大的学习率,防止过拟合,降低参数初始化要求 缺点:对batch_size有依赖,batchsize较大时效果才会不错,而且不适用于深度不固定的网络

动机和本质:训练是为了学习数据的分布,在神经网络中,因为每个隐层的参数不同,会使下一层的输入发生变化,从而导致每一批数据(每个batchsize的数据)的分布发生变化,使得网络每次迭代时需要拟合不同的数据分布,增大了网络训练的难度和过拟合风险,所以Batch Normalization对每层网络的输出做标准化处理。

训练和测试的不同:训练时对一个batch做统计,得到均值方差。测试时,用全局统计量代替batch统计量。对训练过程中的每一个batch得到的均值方差求期望。

为什么训练时不用全局统计量:使用BN的目的是保证训练时每一批数据的分布稳定,使用全局统计量违背了这个初衷。

其他Normalization:

IN(对H*W做统计),LN(对C*H*W做统计)   GN(对n个通道的feature map做统计,n=1时,就是IN;n=C时,就是LN)

 

L1,L2正则化:

为什么L1稀疏,L2平滑?从求导公式上讲,参数wi在L1正则化时经过梯度更新后减少一个固定的很小的值,若干次迭代后,权值可能将为0;而在L2正则化中,参数w经过梯度更新后会收敛到较小的值但不为0.从拉格朗日乘子法解释,添加正则化相当于在范数约束下求最值,最优解位于范数约束的边界上。

作用:L1正则化可以产生更稀疏的权值矩阵,可以用于特征选择,一定程度上防止模型过拟合。L1正则化适用于特征间有关联的情况,L2正则化适用于没有关联的情况。

为什么正则化能防止模型过拟合:更小的权值能降低模型复杂度,对噪声和异常的抗干扰能力更强。

 

Dropout:

dropout奏效的原因:如果模型间独立,则Bagging可以降低方差。而神经网络能够找到足够多不同的解,表明他们也可以从模型平均中收益。神经网络可以因随机初始化的差异,批训练数据的随机选择等使模型间有一定的独立性;dropout减少了神经元之间的依赖。

通常隐藏层(一般用在全连接层)的采样率设为0.5,输入层的采样率设为0.8.

Dropout的训练和推断:推断时需要加上权重比例(在训练结束后,将权重乘以采样率),以确保推断时该单元的期望总收入与训练时该单元的期望总收入相同。在训练时,只用一部分节点来得到结果,预测时,使用全部节点进行推断。

Bagging与dropout的对比:bagging中所有的分类器时独立的,dropout中模型共享参数;

Bagging中所有的模型都训练到收敛,dropout中每次都是随机dropout,然后训练一个子网络。

激活函数:

向网络中加入了非线性因素,增强了网络拟合能力。

为什么relu相对于sigmoid有优势:避免了梯度消失,比tanh/sigmoid有更快的收敛速度,加速运算;减少过拟合(relu的负半区参数不为0,不被训练,从而减少了参数依赖)。但ReLU单元脆弱且可能会在训练中死去,所以现在用leaky relu较多。

 

CNN中的参数和计算量

Paras=oc*(k*k*c+1),h*w为卷积层的尺寸

FLOPS=H*W*oc*(k*k*c+1),其中H*W是输出的feature map的尺寸,oc是output channel.

CNN特征:稀疏交互和参数共享,减少了参数,提取了局部特征,具有平移不变性。

CNN的卷积实现

先将kernel按照stride循环展开成一个稀疏矩阵

 

激活函数:

向网络中加入了非线性因素,增强了网络拟合能力。

为什么relu相对于sigmoid有优势:避免了梯度消失,比tanh/sigmoid有更快的收敛速度,加速运算;减少过拟合(relu的负半区参数不为0,不被训练,从而减少了参数依赖)。但ReLU单元脆弱且可能会在训练中死去,所以现在用leaky relu较多。

 

CNN中的参数和计算量

Paras=oc*(k*k*c+1),h*w为卷积层的尺寸

FLOPS=H*W*oc*(k*k*c+1),其中H*W是输出的feature map的尺寸,oc是output channel.

CNN特征:稀疏交互和参数共享,减少了参数,提取了局部特征,具有平移不变性。

CNN的卷积实现

先将kernel按照stride循环展开成一个稀疏矩阵

参考https://blog.csdn.net/qianqing13579/article/details/71844172
或者caffe中的实现:

将输入图像或特征图从3D数组转换成的二维数组。应用卷积操作的位置都是图像中的一个小三维立方体,因此我们将这些立方体中的值拉直作为矩阵的一行。这就是所谓的im2col

然后把卷积核拉为一列:

 

多种CNN卷积:

1.3D卷积:

沿着长 宽 高 3个维度进行滑动

2.    1*1卷积

3、反卷积/转置卷积

(Deconvolution / Transposed Convolution):用于上采样

空洞卷积(膨胀卷积)(Dilated Convolution / Atrous Convolution):先按照一定比例在原特征图的中间和边缘补0来扩大输入特征图的尺寸,然后进行正常的卷积操作。

4、可分离卷积:

n*n卷积变为n*1卷积和1*n卷积,先横向扫面,在纵向扫描

5、深度可分离卷积:

先在各个通道上做一通道的平面卷积,得到各自通道做卷积的结果。然后,使用多个1*1的卷积做卷积。

6.扁平卷积

 

7.组卷积(gropu convolution):

标准卷积是在所有的通道上做卷积(假设通道数为Ci).组卷积就是根据通道将输入特征图分为g组,每组的通道数为Ci/g.然后分开后的各组数据自行卷积,卷积后的特征图做concat操作,该操作可以减少参数。

8.可变形卷积(Deformable Conv

 

上图的offset field就是变形卷积外加的待训练参数,大小和输入层图片大小一样(input feature map),卷积窗口在offset field上滑动就呈现了卷积像素偏移的效果,达到采样点优化的效果。

        在实际应用中,对于一个的输入,若使用3*3的卷积核,则先通过卷积,生成一个新的channel数为2*3*3的feature map(大小不变),分别代表不同方向上x,y的offset值。

 

网络梯度消失和爆炸

原因

也就是w比较大的情况。则前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题。

解决办法:梯度截断,使用线性整流激活函数,使用batcNorm,使用resnet, 良好的参数初始化策略(比如用预训练的参数做微调);

性能度量方式

混淆矩阵:

T:预测正确与否  P:预测结果是什么

Precision:TP/(TP+FP)预测为正样本的数目

Recall:TP/(TP+FN)实际为正样本的找到多少

2/F1 = 1/P+1/R

mAP(平均精度均值):各个类别的平均精度(AP)的均值

 

Loss的设计:

L1,L2,smooth L1,Huber loss

L1 loss: 在误差接近0的时候不平滑,所以比较少用到这个范数

Smooth L1(分段函数):

L2 loss: 当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。

Huber Loss: 相比与l2 loss,其对离群点(outliers)没有那么敏感。当残差(residual)很小的时候,loss函数为l2范数,残差大的时候,为l1范数的线性函数

交叉熵和MSE(Mean Squared Error均方误差):

 

 

Softmax_loss,central_loss和triple_loss

Central_loss: 在图像识别中,我们通过卷积提取特征,底层的全连接层是一个线性分类器,用来区分数据类别。实际应用中,我们不但希望类间距离大,而且希望类内距离小,这样能增加鲁棒性。center loss的原理主要是在softmax loss的基础上,通过对训练集的每个类别在特征空间分别维护一个类中心,在训练过程,增加样本经过网络映射后在特征空间与类中心的距离约束,从而兼顾了类内聚合与类间分离。整体的损失函数:Softmax Loss (保证类之间的feature距离最大)与 Center Loss (保证类内的feature距离最小,更接近于类中心)

每个类别的中心c是如何定义的?batch训练的时候不断地计算更新它,每一轮计算一下当前数据和center的距离,然后把这个距离梯度叠加到center上。

参考:https://blog.csdn.net/u013841196/article/details/89885167

Triplet loss:

Triplet Loss是深度学习中的一种损失函数,用于训练差异性较小的样本,如人脸等, Feed数据包括锚(Anchor)示例、正(Positive)示例、负(Negative)示例,通过优化锚示例与正示例的距离小于锚示例与负示例的距离,实现样本的相似性计算。

训练样本:triplet是一个三元组,这个三元组是这样构成的:从训练数据集中随机选一个样本,该样本称为Anchor,然后再随机选取一个和Anchor (记为x_a)属于同一类的样本和不同类的样本,这两个样本对应的称为Positive (记为x_p)和Negative (记为x_n),由此构成一个(Anchor,Positive,Negative)三元组。

 

由目标函数可以看出:

当x_a与x_n之间的距离 < x_a与x_p之间的距离加时,[]内的值大于零,就会产生损失。

当x_a与x_n之间的距离 >= x_a与x_p之间的距离加时,损失为零。

 

上采样的四种方式:

上池化(UnPooling)、插值上采样(UNSampling)与反卷积(Deconvolution),亚像素卷积

亚像素卷积:(r^2*H*W)->(1*rH*rW)

网络训练时的常见问题解决:

数据不均衡问题

解决方式:采样(上采样、下采样);数据合成(SMOTE利用小众样本在特征空间的相似性生成新的样本),对损失函数加权,对正负样本极不均衡时,可以用异常检测或者一分类。

一分类特殊的场景,比方说,有一个小和尚,他从小在寺庙长大,从来都只见过男生,没见过女生,那么对于一个男性,他能很快地基于这个男性与他之前接触的男性有类似的特征,给出这个人是男性的答案。但如果是一个女性,他会发现,这个女性与他之前所认知的男性的特征差异很大,进而会得出她不是男性的判断。我们只能根据它与小和尚认知的男性特征不一致,得出它不是男性的判断,至于它是女性呢,还是第三性别,甚至是外星人,对不起,并不知道,我们只能将其排除出男性的范围,并不能给它做出属于哪类的决策。

参考:https://www.zhihu.com/question/22365729

训练不收敛

  • 没有对数据进行归一化
  • 通过可视化检查输入和输出(比如输入是否样本不均衡,输出的数量级是否太大)
  • 没有对数据进行预处理(比如H矩阵去拟合8个偏差而不是直接H矩阵,目标检测中边界框的预测等)
  • 网络中包含坏梯度(打印梯度的传播)
  • Loss的设计
  • 是否需要手动增加新的特征
  • 使用过大的样本(破坏梯度下降的随机性)

检查学习率,检查激活函数,检查初始化权重等

怎么确保神经网络学到了东西或者怎么查看神经网络学到了什么?

1.2014ECCV上的一篇经典文献:《Visualizing and Understanding Convolutional Networks》将神经网络学到的东西可视化

2.对网络学到的东西进行限制,比如从损失函数入手,从数据增强入手

 

编程:

卷积操作 矩阵相乘

计算核的半径,遍历图片,遍历卷积核

void Convlution(Mat  InputImage, Mat  OutputImage, Mat kernel)

{

       //计算卷积核的半径

       int sub_x = kernel.cols / 2;

       int sub_y = kernel.rows / 2;

       //遍历图片 

       for (int image_y = 0; image_y < InputImage.rows - 2 * sub_y; image_y++)

       {

              for (int image_x = 0; image_x < InputImage.cols - 2 * sub_x; image_x++)

              {

                     int pix_value = 0;

             //遍历卷积核

                     for (int kernel_y = 0; kernel_y < kernel.rows; kernel_y++)

                     {

                            for (int kernel_x = 0; kernel_x < kernel.cols; kernel_x++)

                            {

                                   double  weihgt = kernel.at<double>(kernel_y, kernel_x);

                                   int value = (int)InputImage.at<uchar>(image_y + kernel_y, image_x + kernel_x);

                                   pix_value += weihgt*value;

                            }

                     }

                    OutputImage.at<uchar>(image_y + sub_y, image_x + sub_x) = (uchar)pix_value;

              }

       }

}

 

IOU和NMS:

import numpy as np

 

def py_cpu_nms(dets, thresh):

    """Pure Python NMS baseline."""

#x1、y1、x2、y2、以及score赋值,其中x1,y1是所有的预测边框的左上角坐标,x2,y2是所有的预测边框的右下角坐标。其中dets[:, 4]是所有的预测边框的得分值(该预测框包含该类别目标的概率)

    x1 = dets[:, 0]

    y1 = dets[:, 1]

    x2 = dets[:, 2]

    y2 = dets[:, 3]

    scores = dets[:, 4]

#得到每一个预测框的面积

    areas = (x2 - x1 + 1) * (y2 - y1 + 1)

    order = scores.argsort()[::-1]#按照scores的值的大小排序后,各个值在scores中的索引,具体下面会给解释

 

    keep = []

    while order.size > 0:

        i = order[0]#order[0]是得分最高的边界框在scores中的索引

        keep.append(i)

        xx1 = np.maximum(x1[i], x1[order[1:]])#将x1[order[1:]的每个值分别与x1[i]比较后,返回两者之中较大的值,并构成列表,下面会有解释

        yy1 = np.maximum(y1[i], y1[order[1:]])

        xx2 = np.minimum(x2[i], x2[order[1:]])

        yy2 = np.minimum(y2[i], y2[order[1:]])

#依次计算每一个边界框与得分最高的边界框的IoU,将IoU大于阈值的边界框去掉

        w = np.maximum(0.0, xx2 - xx1 + 1)#0表示没有交集

        h = np.maximum(0.0, yy2 - yy1 + 1)

        inter = w * h #计算相交的面积,不重叠时面积为0

#计算IoU:重叠面积 /(面积1+面积2-重叠面积)

        ovr = inter / (areas[i] + areas[order[1:]] - inter)#计算IoU,两者的并集大小为(面积1+面积2-重叠面积)

 

        inds = np.where(ovr <= thresh)[0]#只有IoU小于阈值的被保留下来。np.where返回满足条件的索引

        order = order[inds + 1]#IoU小于阈值的被保留下来

 

return keep

 

 

 

RNN和LSTM

参考https://blog.csdn.net/heyongluoyao8/article/details/48636251

RNN介绍:RNNs称为循环神经网路,用来处理序列数据。即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层还包括上一时刻隐藏层的输出。

RNN的几种形式:

每个时间步都有输出,且隐藏单元之间有循环连接

每个时间步都有输出,但是隐藏单元之间没有循环连接,只有当前时刻的输出到下个时刻的隐藏单元之间有循环连接  

隐藏单元之间有循环连接,但只有最后一个时间步有输出

 

LSTM介绍 在传统 RNN 的基础上加入了门控机制来限制信息的流动

LSTM 中加入了三个遗忘门 f输入门 i输出门 o,以及一个内部记忆状态 C遗忘门 f控制前一步记忆状态中的信息有多大程度被遗忘;输入门 i控制当前计算的新状态以多大的程度更新到记忆状态中;记忆状态 C间的状态转移由输入门和遗忘门共同决定;输出门 o控制当前的输出有多大程度取决于当前的记忆状态。

参考:https://github.com/DarLiner/Algorithm_Interview_Notes-Chinese/blob/master/A-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/B-%E4%B8%93%E9%A2%98-RNN.md

LSTM 是如何实现长短期记忆的?(遗忘门和输入门的作用)

LSTM中的激活函数:

 

 

网络模型:

Inception:

参考:https://blog.csdn.net/liuxiao214/article/details/81914743

Inception1(多尺度): 传统网络都是通过层的叠加,增加网络深度,这篇论文提出从网络宽度上改进,通过concat操作,将经过不同大小的kernel的feature map进行concat,增加网络对尺度的适应性、增加网络的宽度,提高了网络内部资源的利用率。

 

网络模型:

Inception:

参考:https://blog.csdn.net/liuxiao214/article/details/81914743

Inception1(多尺度): 传统网络都是通过层的叠加,增加网络深度,这篇论文提出从网络宽度上改进,通过concat操作,将经过不同大小的kernel的feature map进行concat,增加网络对尺度的适应性、增加网络的宽度,提高了网络内部资源的利用率。

 

Inception v2(卷积核的改进): 首次提出BN层,将每一次一个batch中的数据分布控制在均值为0,方差为1;对卷积核进行分解:使用两个3x3卷积核代替5x5卷积核,三个3x3卷积核代替7x7卷积核,减少参数量,加快计算。(两个3x3与一个5x5作用是一样的,其感受野都是5); 进一步将nxn卷积核分解为1xn和nx1卷积核;;

 

Inception v3:通过并行的结构减少feature map的size(避免了因为特征图大小的急剧衰减会丢失大量的信息),增加channel数

 

 

Inception v4:基于inception v3的基础上,提出stem模块, 用于对进入Inception模块前的数据进行预处理。stem部分其实就是多次卷积+2次pooling,pooling采用了Inception-v3论文里提到的卷积+pooling并行的结构,来防止bottleneck问题。stem后用了3种共14个Inception模块. Inception v4 引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。

 

引入残差结构,提出了inception-resnet-v1和inception-resnet-v2,并修改inception模块提出了inception v4结构。基于inception v4的网络实验发现在不引入残差结构的基础上也能达到和inception-resnet-v2结构相似的结果,

ResNet系列:

ResNet

残差结构:将直接学习H(x)通过跳跃连接和恒等映射转为学习F(x)+x中的残差F(x),让网络具有了恒等变换的能力。主要解决两个问题:梯度消失(batchNorm),随着网络深度增加,性能没有提升反而有所下降。

ResNext:

提出原因:传统的要提高模型的准确率,都是加深或加宽网络,但是随着超参数数量的增加(比如channels数,filter size等等),网络设计的难度和计算开销也会增加。因此本文提出的 ResNeXt 结构可以在不增加参数复杂度的前提下提高准确率,同时还减少了超参数的数量,增大可扩展性

介绍:ResNext同时采用 VGG 堆叠的思想和 Inception 的 split-transform-merge 思想,但是可扩展性比较强,可以认为是在增加准确率的同时基本不改变或降低模型的复杂度。提出了 aggregrated transformations,用一种平行堆叠相同拓扑结构的blocks代替原来 ResNet 的三层卷积的block,在不明显增加参数量级的情况下提升了模型的准确率,同时由于拓扑结构相同,超参数也减少了,便于模型移植

 

DenseNet:

加强了feature的传递,将每一层都与后面的层连接起来,把特征图进行concat,然后再经过线性变换。

在dense block中引入bottleneck layer,即卷积3x3前增加1x1卷积,以此来减少feature map数量,在每个dense block之间,增加了translation layer,通过1x1卷积核来实现。

 

DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度(channels)。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。

 

Attention(注意力)机制

解释和作用:

学习权重分布:输入数据或特征图上的不同部分对应的权重不同

- 这个加权可以是保留所有分量均做加权(即soft attention);也可以是在分布中以某种采样策略选取部分分量(即hard attention),此时常用RL(强化学习)来做。

- 这个加权可以作用在原图上,也就是《Recurrent Model of Visual Attention》(RAM)和《Multiple Object Recognition with Visual Attention》(DRAM);也可以作用在特征图上,如后续的好多文章(例如image caption中的《 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》)。

- 这个加权可以作用在空间尺度上,给不同空间区域加权;也可以作用在channel尺度上,给不同通道特征加权;甚至特征图上每个元素加权。

- 这个加权还可以作用在不同时刻历史特征上,如Machine Translation。

 

2) 任务聚焦:通过将任务分解,设计不同的网络结构(或分支)专注于不同的子任务,重新分配网络的学习能力,从而降低原始任务的难度,使网络更加容易训练。

参考https://blog.csdn.net/yideqianfenzhiyi/article/details/79422857

 

SENet:

DANet中有空间注意力机制。

 

 

机器学习

生成式和判别式

判别模型:学习P(Y|X),学到的是判别边界,输入特征X可以直接得到Y,如线性回归模型,SVM模型。

 

生成模型:学习P(X,Y),输入特征X,需要求X与不同类别Y之间的联合概率分布(即求P(X,Y1)…P(X,Yn)),概率大的为预测结果。如朴素贝叶斯,隐马尔可夫模型HMM都是生成式模型。

 

判别式模型举例:要确定一个羊是山羊还是绵羊,用判别模型的方法是从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率。

生成式模型举例:利用生成模型是根据山羊的特征首先学习出一个山羊的模型,然后根据绵羊的特征学习出一个绵羊的模型,然后从这只羊中提取特征,放到山羊模型中看概率是多少,在放到绵羊模型中看概率是多少,哪个大就是哪个。

判别式模型是根据一只羊的特征可以直接给出这只羊的概率(比如logistic regression,这概率大于0.5时则为正例,否则为反例),而生成式模型是要都试一试,最大的概率的那个就是最后结果~


逻辑回归

介绍:

逻辑回归是在数据服从伯努利分布(为正的概率为p,为负的概率为1-p,且样本间独立同分布)的假设下,通过极大似然的方法,运用梯度下降法来求解参数,从而达到将数据二分类的目的。

逻辑回归的公式,损失函数和优化方法

公式:

P(Y=1|X)=h(x),P(Y=0|X)=1-h(x)

 

通过极大似然函数法+取对数,可得逻辑回归的损失函数

辑回归通过梯度下降法求解(常用的梯度下降法有Adam,并且在学习时可以让学习率衰减)或者拟牛顿法

逻辑回归是如何用回归做分类的

逻辑回归作为一个回归函数,如何用于分类问题。 逻辑回归中,对于每个 x其条件概率 y 的确是一个连续的变量。而逻辑回归中可以设定一个阈值y 值大于这个阈值的是一类,y 值小于这个阈值的是另外一类。至于阈值的选择,通常是根据实际情况来确定,一般情况下选取 0.5 作为阈值来划分。

为什么逻辑回归使用极大似然函数来得到其损失函数?

从上面求导可以看出,dl/dw只和x,y有关,与sigmoid的导数无关,这样的参数更新速度比较稳定。

训练时去掉高度相关特征?

为什么使用逻辑回归的时候,在训练过程中将高度相关的特征去掉?

让模型的可解释性更好;加快收敛速度

逻辑回归的优缺点:

可解释性好,从特征的权重可以看到不同特征对结果的影响;训练速度块,资源占用少;可以方便的通过调整阈值来调整输出

缺点:准确率低,难以处理数据不均衡问题,本身无法筛选特征

 
 
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值