面试问题总结——关于面试中可能提问的问题及解答(一)

  1. 前面几篇博客我已经陆续整理了YOLO系列、OpenCV系列、C++系列的面试题知识点,若有需要直接访问以下链接。
  2. 面试问题总结——关于YOLO系列(一)
  3. 面试问题总结——关于YOLO系列(二)
  4. 面试问题总结——关于YOLO系列(三)
  5. 面试问题总结——关于OpenCV
  6. 面试问题总结——编程题关于IOU、NMS
  7. 面试问题总结——关于C++(一)
  8. 面试问题总结——关于C++(二)

  • 作为最后一个系列,主要介绍深度学习、机器学习、Python相关的一些面试题,其中包括秋招时遇到的问题还有牛客网面经上我搜集整理的一些面试高频题。
    在这里插入图片描述

1.YOLOv4相比于YOLOv3,做了哪些改进,能讲讲吗?

(详解可以看面试问题总结——关于YOLO系列(三)中 四.YOLOv4
  YOLOv4的改进方法分为两类:BoF和BoSBoF方法只改变训练策略或者只增加训练的成本与时间,但不会影响测试阶段的性能;BoS方法只会增加少量的推理成本但却能显著提高对象检测精度的插入组件和后处理方法。

  BoF中比如马赛克数据增强,通过读取四张图片,然后分别进行翻转、缩放等操作,接着拼成一张图片。这种方法可以丰富图片背景,大大扩充训练数据集。而且随机缩放操作增加了很多小目标,使得训练出的模型更加鲁棒。还有标签平滑处理,比如对于一个标签矩阵 [0,0,1] 转化为-> [0.01,0.01,0.98],分类标签的平滑,将0,0,1转变成0.01,0.01,0.98,这样会提高识别精度。

  BoS中主要是修改了原先的NMS,改成了DIoU-NMS,不仅考虑了检测区域的重叠,而且还考虑了检测区域间的中心点距离。还有激活函数改成了Mish激活函数,理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界。

  在主干网络中,CSPDarknet53的特征采用SPP层的方式,能更有效的增加主干网络的感受野,SPP的结构是三层最大池化,这里说一下感受野的定义。
感受野(Receptive Field),指的是神经网络中神经元“看到的”输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。
卷积神经网络中,越深层的神经元看到的输入区域越大,即越深层的神经元的感受野越大。
所以,感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。);
  同时,我个人还觉得,通过SPP还可以有效减少特征提取的参数量,因为SPP是在主干网络之后,主干网络用来提取特征信息,对于提取到的信息肯定会有很多冗余,采用SPP即最大池化可以减少冗余,这是我个人观点。

损失函数上的改进

  YOLOv4的损失函数在YOLOv3的损失函数基础上使用CIOU(complete intersection over union)误差代替了均方误差(MSE,mean square error)作为回归框预测误差。CIOU解决了一般IOU无法直接优化两个框没有重叠的部分的问题,并且综合考虑了边界框的重叠面积、中心点距离,长宽比等因素,使得预测框回归的速度和精度更高。
  YOLOv4的损失函数可以由回归框预测误差置信度误差分类误差三部分相加而成。
https://blog.csdn.net/zandaoguang/article/details/107398963

2.你在模型训练的过程中,对于loss值若没有收敛,该有哪些操作呢?该使用什么办法?

  ①如果loss突然一直很大:可能是学习率learning rate设大了,适当把学习率调低,或者每迭代10个epoch,学习率依次减小,在开始阶段不能把学习率设置的太低否则loss不会收敛,我的做法是逐渐尝试,从0.1,0.08,0.06,0.05 …逐渐减小直到正常为止

  ②如果数据太少就尽量缩小模型复杂度,考虑减少层数。

  ③train loss与test loss结果分析
  train loss 不断下降,test loss不断下降,说明网络仍在学习;
  train loss 不断下降,test loss趋于不变,说明网络过拟合;
  train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
  train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
  train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。

  ④训练网络的时候loss一直居高不下或者准确度时高时低,震荡趋势,反正要保证自己的训练次数够多,只要总体上收敛就行,就像我跑Darknet的YOLOv4模型时,虽然设置的迭代次数是4000次,但模型实际在2800次的时候就已经趋于平稳进入震荡期了。

有些面试官还会问一些深度学习调参心得的问题,这个问题也确实能够体现是不是真正自己去炼过丹。

3.在数字图像处理中,腐蚀和膨胀的原理是什么?

  腐蚀和膨胀都是针对白色区域即亮的区域的膨胀就是将亮的区域变大,腐蚀就是将亮的区域变小

  膨胀就是求局部最大值的操作,因为要将亮的区域变大嘛,即灰度值变大,类似于卷积操作,将图像和核进行卷积,核的大小可以自己定义,将图像A与核B进行图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素,这样就会使图像中的高亮区域逐渐增长。

  腐蚀就是求局部最小值的操作。

4.关于NMS,简单讲讲?

  NMS就是非极大值抑制,依靠分类器得到多个候选框,以及关于候选框中属于类别的概率值,根据分类器得到的类别分类概率做排序,具体算法流程如下:

  ①将所有框的得分排序,选中最高分及其对应的框;
  ②遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。(为什么要删除,是因为超过设定阈值,认为两个框的里面的物体属于同一个类别,比如都属于狗这个类别。我们只需要留下一个类别的可能性框图即可。)
  ③从未处理的框中继续选一个得分最高的,重复上述过程。

5.关于K-means算法的相关知识

K-means算法思想:

  根据给定的n个数据对象的数据集,构建k个划分聚类的方法,每个划分聚类即为一个簇。该方法将数据划分为n个簇,每个簇至少有一个数据对象,每个数据对象必须属于而且只能属于一个簇,同时要满足同一簇中的数据对象相似度高,不同簇中的数据对象相似度较小,聚类相似度是利用各簇中对象的均值来进行计算的。

K-means算法的处理流程:

  ①随机选取k个中心点;
  ②遍历所有数据,将每个数据划分到最近的中心点中;
  ③计算每个聚类的平均值,并作为新的中心点;
  ④重复2-3,直到这k个中线点不再变化(收敛了)。

  时间复杂度:O(k×n×d×t),其中k表示聚类中心个数,n表示数据量即总共的点数,d表示距离计算的复杂度,t表示迭代次数。

  空间复杂度:O(n)
  关于评估聚类的效果,可以有欧式距离(即两点的距离,根号下的平方)、曼哈顿距离(|x1-x2|-|y1-y2|)。

在yolo中anchor的选取—K-means算法

  在anchor框聚类中,如果用欧式距离来度量的话,显示是不合理的,因为大的预测框会产生大的欧式距离,小的预测框会产生小的欧氏距离,但我们需要大小框产生同样的效果影响,所以使用IOU,IOU是和box的大小无关的,公式如下:
     d(box, centroid) = 1 - IOU(box, centroid)

其中box表示某个类别的ground truth,centroid表示聚类中心框。

K-means算法的优缺点

  优点:
  该算法简单高效,易于理解和实现,我还是挺喜欢这个算法的,在我的项目里面也多次用到了这个算法。

  缺点:
  ①需要人为事先确定簇的个数,k 的选择往往会是一个比较困难的问题,对于某些数据集,一开始并不知道究竟可以分成几类;
  ②对噪声和异常数据非常敏感,如果某个异常值具有很大的数值,则会严重影响数据分布;
  ③不能解决非凸形状的数据分布聚类问题;
  ④主要用于发现圆形或者球形簇,不能识别非球形的簇
  ⑤对初始值的设置很敏感,算法的结果与初始值的选择有关。

K值怎么确定,有什么方法吗?

  解决办法:因为Kmeans聚类的效果评估方法是误差项平方和,就是计算所有点到相应簇中心的距离均值,当然,k值越大,SSE(误差项平方和)越小,我们就是要求出随着k值的变化SSE的变化规律,找到SSE减幅最小的k值,这时k应该是相对比较合理的值。

  比如,在如下这张图中,最佳的k值是3。
在这里插入图片描述

6.你项目中用的拍照相机分辨率是3072×2048的,而YOLOv4网络的输入尺寸是608×608×3,这么做的话,图像的尺寸会被压缩,小的目标可能会被忽略,那如果要识别小的目标你怎么办?既要保证识别的速度,如何做?

  首先要考虑的是YOLOv4中的输入尺寸大小是608×608,而我的训练图片大小是3072×2048的,如果缩放图片到608×608,待检测的目标可能就会被缩放没了。

  解决办法:把图片切下来,按照一批一批的来训练,比如原图是(C、H、W),切成N份,就是(N、C、H、W),切的过程中就一个要求,就是不能把目标一分为二切坏了,对于不足608大小的图像的补全就好了比如填充为黑色。

7.SPP,YOLO了解吗?

  SPP-net对R-CNN最大的改进就是特征提取步骤做了修改,其他模块仍然和R-CNN一样。特征提取不再需要每个候选区域都经过CNN,只需要将整张图片输入到CNN就可以了,ROI特征直接从特征图获取。R-CNN中候选区域需要变形缩放,事实上,只是网络的最后阶段—全连接层需要固定的尺寸输入,因此引入空间金字塔池化SPP来移除对网络固定尺寸的限制,避免输入的裁剪或者变形。SPP-net的缺点也很明显,它仍然属于R-CNN的框架,离端到端的距离还很远。

  YOLO的核心思想在于将目标检测问题视作回归问题解决。用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。算法首先把输入图像划分成S×S的格子,然后对每个格子都预测B个bounding boxes,每个bounding box都包含5个预测值:x,y,w,h和confidence。缺点:对靠的很近的物体以及小群体检测效果并不好。

8.目标检测正负样本不均衡怎么解决?

  因为正负样本总是相差悬殊的,可以通过设置损失函数前面的权重来解决,比如YOLOv3中的损失函数,对于检测到的目标权重系数给的是5,对于非目标的权重系数给的是0.5。

9.one-stage与two-stage都有哪些?具体各自优势在哪里?one-stage和two-stage两者有什么特点?

  One-stage:YOLO系列、SSD等。
  特点:特点是一步到位,直接输入图像之后,就能输出目标检测的结果,速度相对较快,非常适合移动端;因为anchor大小的原因所以检测效果较差。

  Two-stage:R-CNN、Fast R-CNN、Faster R-CNN等。
  特点:使用了复杂的网络用于每个候选区域的分类和回归,内存消耗和计算量都比较大,且Two-stage算法中会对目标进行resize,小目标的特征会被放大,因此检测效果较好。
(补充:R-CNN是对于输入图像会提取2000个区域候选框;而Fast R-CNN是先不着急提取候选框,它是直接先把图像喂到神经网络中去,获得一个共享的特征,然后所有的候选框都能共享这一套特征,这样就能提高速度;Faster R-CNN则是采用了更深层的网络来提取特征。)

10.简单介绍下残差层

残差结构的提出的为了解决深层网络难以训练的问题。

  背景知识:
  ①之所以要构建深层网络,是因为神经网络的每一层分别对应于提取不同层次的特征信息,有低层,中层和高层,而网络越深的时候,提取到的不同层次的信息会越多,而不同层次间的层次信息的组合也会越多。

  ②深度学习对于网络深度遇到的主要问题是梯度消失和梯度爆炸,传统对应的解决方案则是数据的初始化正则化(BN层),但是这样虽然解决了梯度的问题,深度加深了,却带来了另外的问题,就是网络性能的退化问题,深度加深了,错误率却上升了,而残差用来设计解决退化问题,其同时也解决了梯度问题,更使得网络的性能也提升了。

  ③从理论上分析,网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的增加,训练误差会越来越多,这被描述为网络退化
  ResNet的突破技巧:加入skip connection;即一层的输出,直接跳跃多层,链接给另一层。

残差块的结构(Residual block)

在这里插入图片描述
在这里插入图片描述
  上图中,可以看到a[l]是这一层残差块的输入,经过第一层线性变化并激活后的输出得到a[l+1],再经过第二层线性变化并激活后的输出得到a[l+2]。残差结构是将输入a[l]直接链接到第二层ReLU激活函数之前,这条路径称作shortcut连接

残差结构有效的原理

  因为在设计的深层次网络是有很多网络层是冗余的,那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同,具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。

解决问题的数学原理

①为什么可以解决梯度消失?
  以上图为例,假设输入是a[l],正常的计算经过两层的线性变换和激活函数之后变成了a[l+2]=F(a[l]),再加上残差结构的输出a[l],最终输出a[l+2]=F(a[l]) + a[l],可以发现,链式求导之后不管F括号部分的参数有多小,因为a[l]对自身求导等于1,都能保证该节点参数更新不会发生梯度消失或梯度爆炸现象。

②为什么可以解决网络退化问题?
  前面已经说了,随着网络的层数增加,错误率也会增加且存在一个累计的趋势,如果网络自行决定了哪些层是冗余层后,通过学习残差F(a[l])=0来让该层网络恒等映射上一层的输入,使得有了这些冗余层的网络效果与没有这些冗余层的网络效果相同,这样很大程度上解决了网络的退化问题

ResNet解决网络退化的机理

  • 深层梯度回传顺畅
      恒等映射这一路的梯度是1,把深层梯度注入底层,防止梯度消失;
      没有中间商层层盘剥;

  • 类比其它机器学习模型
       集成学习boosting,每一个弱分类器拟合“前面的模型与GT之差”;
      长短时记忆神经网络LSTM的遗忘门;
       Relu激活函数;

  • 传统线性结构网络难以拟合“恒等映射”
      什么都不做有时很重要;
       skip connection可以让模型自行选择要不要更新;
       弥补了高度非线性造成的不可逆的信息损失;(MobileNet V2)

  • ResNet反向传播传回的梯度相关性好
    参考论文:The Shattered Gradients Problem: If resnets are the answer, then what is the question?
    https://arxiv.org/abs/1702.08591
      网络加深,相邻像素回传回来的梯度相关性越来越低,最后接近白噪声。但相邻像素之间具有局部相关性,相邻像素的梯度也应该局部相关。
      相邻像素不相关的白噪声梯度只意味着随机扰动,并无拟合。
      ResNet梯度相关性衰减从 1/2L 增加为1/L1/2 。保持了梯度相关性。

  • ResNet相当于几个浅层网络的集成
    参考论文:Residual Networks Behave Like Ensembles of Relatively Shallow Networks
    https://arxiv.org/abs/1605.06431
      2n个潜在路径,类似于dropout;
      测试阶段去掉某几个残差块,几乎不影响性能。
    在这里插入图片描述
    上图所示,(a)图如果去掉了f2,则整个网络就废掉了,(b)图就算去掉了f2,网络仍然能够正常运行,如下图所示。有点类似于电路中的串联和并联。
    在这里插入图片描述

  • skip connection可以实现不同分辨率特征的组合
      FPN、DenseNet

  • ResNet数学本质是用微分方程的积分曲线去拟合系统的目标函数
    构造一个平滑的解空间流形,在这个平滑的流形上更容易找到解。

  • 残差网络相当于不同长度的神经网络组成的组合函数

  • 残差模块相当于一个差分放大器

11.YOLOv1的网格为什么是7×7?

  因为只有网格是奇数的情况下,其整个图像的中心点会确定在中心的一个grid cell中,如果网格是偶数,中心点就会落在四个grid cell的交界点,无法确定到底属于哪个grid cell,YOLOv2是分成了13×13个网格。

12.YOLOv3优点/缺点

  优点:
  ①检测速度快;
  ②背景的误检率低,因为YOLO的候选框提取是基于全图的,而RCNN系列都是先提取一定数量的候选框,有点类似于管中窥豹,不能综合整张图的信息;
  ③通用性强。

  缺点:
  相比RCNN系列物体检测方法,仍然存在识别物体位置精确性差、召回率低的缺点。

(Recall(召回率):指的是所有真实目标中被检测出来的比例。)

13.张量、向量和矩阵

  0维的张量就是标量1维的张量就是向量2维的张量就是矩阵,大于等于3维的张量没有名称,统一叫做张量

おすすめ

転載: blog.csdn.net/qq_45445740/article/details/120548090