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

  • 该系列最后一章,加油!
    在这里插入图片描述

面试中遇到的问题及解答

24.关于softmax函数的公式、作用、注意点即改进

在这里插入图片描述

实现代码

import numpy as np

a = np.array([1010,1000,990]) # softmax函数的运算
res1 = np.exp(a)/np.sum(np.exp(a)) # 没有被正确计算
print(res1)
# [nan nan nan]

c = np.max(a) # 1010
print(a-c)
# [  0 -10 -20]

res2 = np.exp(a-c)/np.sum(np.exp(a-c))
print(res2)
# [9.99954600e-01 4.53978686e-05 2.06106005e-09]

实现softmax函数时的注意事项

在这里插入图片描述
在这里插入图片描述

softmax的作用?

  通过softmax函数的作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

25.YOLO SSD Faster-RCNN对比

  Faster-RCNN是Two Stage算法,是经过了一系列发展而来。首先是RCNN,在这个算法中神经网络实际上就是一个特征提取器,作者用选择性搜索的方法提取一定数量(2000个)的候选框(region proposal),然后对这些候选框做卷积操作,将fc7这一层的特征提取出来用于分类和坐标回归,这里分类用的还不是softmax而是SVM,这个算法的贡献主要是提出了一种有效的特征利用方式,后续很多人在工程实践中都是用的fc7层的特征来做基于faster RCNN的应用。其次是Fast-RCNN,它将除了候选框提取以外的部分都用一个网络来实现,并且和RCNN不同的是,它在提取特征时并不会把每个候选框都放入提取,而是将整幅图提取特征后,用坐标映射的方式提取特征,这样提高了速度。最后是Faster-RCNN,因为一开始都是用选择性搜索的方法提取特征,这里作者采用特征提取网络来取代,并且与Fast-RCNN的分类和回归网络共用特征提取层,提高了速度和准确率。

  YOLO系列是我重点研究的,YOLO的一个贡献就是将检测问题转化为了回归问题,指的就是之前Faster-RCNN是先分两步,先提取候选框,也就是判断是前景还是背景的问题,之后再分类,具体看前景是什么东西,而YOLO直接通过回归一次既产生坐标,又产生每种类别的概率。YOLO的特点就是快。

  SSD我感觉就是Faster-RCNN和YOLO的结合体,了解的不多,但YOLO的检测层是由三级特征层融合,而SSD只是对一层特征层的细化

  不同的话,在anchor boxes 大小的取法不同:SSD的anchor
boxes是算出来的;Faster-RCNN的是固定的;YOLO是用数据集的ground truth boxes通过kmeans算出来的。

YOLOv3为什么占的内存大,和 SSD差别在哪里?

  我觉得是因为YOLOv3引入FPN结构,同时它的检测层由三级feature layers融合,而SSD的六个特征金字塔层全部来自于FCN的最后一层,其实也就是一级特征再做细化,明显一级feature map的特征容量肯定要弱于三级,尤其是浅层包含的大量小物体特征。所以我觉得融合了三层特征层信息这个占有量肯定比一层的大,所以内存大。

26.如何解决目标遮挡问题,密集问题

  之前选课题的时候,有个题目就是类似密集遮挡的问题,我当时去了解了一下,记得是CVPR2018的论文中,有一篇是旷视针对人群检测中密集遮挡问题而提出的Reploss,看到有人拿去检测钢筋缺陷的密集遮挡效果不错,并且Reploss虽然是为行人检测中密集遮挡问题设计的,但其实用于通用的目标检测中也是有效果的,应用起来也很简单,不需要对模型做任何的更改,只是在loss计算的时候修改一下

  在目标检测中,遮挡问题是比较常见的,主要分为两种,第一种是待检测目标之间相互遮挡,第二种是待检测目标与被干扰物遮挡。第一种遮挡又分为类间遮挡和类内遮挡,类间遮挡产生于不同类的物体;类内遮挡产生于同类物体,也被称为密集遮挡。第二种遮挡,由于目标干扰物体遮挡,而算法只能学习待检测物体的特征,因此第二种遮挡只能通过增加样本来优化检测效果。

  密集遮挡的问题:由于密集遮挡的两个目标的类别是相同的,所以两个目标之间的特征是相似的,检测器很可能无法定位。本应该属于目标A的proposal很可能会想目标B发生偏移,导致定位不准确,而目标B本身有自己的proposal,在接下来的NMS中,目标A的proposal很可能被目标B的proposal所抑制,进而造成了目标A的漏检。因此,对于密集遮挡问题,NMS的阈值时很敏感的,阈值过高,造成误检,阈值低,造成漏检。

  目前的目标检测器都是利用回归来进行定位,位置回归的目标是让proposal和ground truth box尽可能的接近,而不考虑周围的物体,如果预测框周围有其他物体时,对其并没有任何的惩罚,所以需要增加这个惩罚项才是突破口。

  其中Rep loss是受到磁石吸引排斥的启发,Reploss包含三个目标:包括一个吸引项和两个排斥项,吸引项的要求是预测框靠近其目标,而排斥项的目标是需要预测框远离周围其他的ground truth物体和proposal。具体的公式我记不得了,在那篇论文中和其他目标检测方法中位置回归的loss一样,使用smoothL1。

27.NMS及其变种(包括具体的代码实现)/编程题NMS

https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247488685&idx=1&sn=73c1274ae8801c6cfd21fd8e72a0206e&chksm=ec1ff954db68704227272a6a563d4df7577bd281490d3605a63444f657e126f980c48c82af87&mpshare=1&scene=23&srcid=#rd

28.如果需要你压缩这个模型的参数量你会怎么做

  ①剪枝——即训练后从网络中去掉不必要的部分。
这包括权重大小剪枝、注意力头剪枝、网络层以及其他部分的剪枝等。还有一些方法也通过在训练期间采用正则化的方式来提升剪枝能力(layer dropout)。

  ②权重因子分解——通过将参数矩阵分解成两个较小矩阵的乘积来逼近原始参数矩阵。
这给矩阵施加了低秩约束。权重因子分解既可以应用于输入嵌入层(这节省了大量磁盘内存),也可以应用于前馈/自注意力层的参数(为了提高速度)。

  ③知识蒸馏——在预训练/下游数据上从头开始训练一个小得多的 Transformer,正常情况下,这可能会失败,但是由于未知的原因,利用完整大小的模型中的软标签可以改进优化。
(目标是让新模型与原模型的softmax输出的分布充分接近)

  ④权重共享——模型中的一些权重与模型中的其他参数共享相同的值。

29.Pytorch定义一个dataset需要写那几个方法

  在学习Pytorch的教程时,加载数据许多时候都是直接调用torchvision.datasets里面集成的数据集,直接在线下载,然后使用torch.utils.data.DataLoader进行加载。

  使用自己的数据集,然后用DataLoader进行加载,常见的两种形式的导入:
  ①整个数据集都在一个文件下,内部再另附一个label文件,说明每个文件的状态,这种存放数据的方式可能更适合在非分类问题上应用。
  ②适合在分类问题上,即把不同种类的数据分为不同的文件夹存放起来,这样,我们可以从文件夹或文件名得到label。
https://blog.csdn.net/xuan_liu123/article/details/101145366

30.给一个input size、kernel size、stride、padding,算一下output size,没有办法整除怎么办,为什么向下取整而不是向上取整?

  卷积向下取整,池化向上取整。
在这里插入图片描述

31.如果检测对象是细长条你怎么检测?如果对象细且倾斜你怎么办?

  细长条的话,对anchor进行重新聚类,以及浅层特征与深层特征融合对象倾斜的话,首先框选的时候,对于目标的打标签就要框选带旋转角度的矩形框,且对于NMS这一步选择INMS,即解决倾斜的目标框,和传统的NMS一样,只是目标框变成了旋转角度的矩形框。

32.如果两个数据集 一个80类一个20类,两个数据中都包含另一个数据集的目标,但未进行标注,你怎么训练?例如:A中的车在B中有 但未标注而是作为标签。

  利用伪标签。
(在模型已经训练的还可以的时候,对无标签数据进行预测,预测的这个标签并不确定是否精准,称之为伪标签。)

33.解决过拟合的办法?

  过拟合含义:就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。

  解决方法
  ①重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的;
  ②增大数据的训练量,可能是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小;
  ③采用正则化方法。正则化方法包括L1正则和L2正则;
  ④采用dropout方法。

34.深度学习中的数据增强方法都有哪些?

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

  有监督的数据增强:单样本数据增强:几何变换类、(2) 颜色变换类;多样本数据增强:SMOTE(通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能)。

  无监督的数据增强:通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN;通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment。

35.卷积计算过程中减少计算量的优化方式

  ①大卷积转化为小卷积:根据VGG的思想,对于大的卷积核可以转换为多个相同卷积串联的方式来减少。比如5X5的卷积核可以换成两个3X3的卷积,此时参数的个数由25变成了18(2X3X3)。

  ②采用DepthWise方式卷积

  ③CReLU:CReLU = [ReLU(x), ReLU(-x)] ,由公式可以看出该方法是为了减少通道数使用的,可以在卷积计算的时候减少一倍的通道数,在非线性激活的时候采用CRELU的方式对输入进行激活可以将输出变成原来的2倍。

  ④去掉全连接层

36.卷积层和池化层有什么区别?

  卷积层
  功能:提取特征;
  操作:对于三维数据比如RGB图像(3通道),经过卷积后输出的通道数等于卷积核的个数,卷积操作会改变输入特征图的通道数;
  特性:权值共享,减少了参数的数量,并利用了图像目标的平移不变性。稀疏连接:输出的每个值只依赖于输入的部分值。

  池化层
  功能:压缩特征图,提取主要特征;
  操作:池化只是在二维数据上操作的,因此不改变输入的通道数。

37.关于Anchor-based与Anchor-free

Anchor-based与Anchor-free的相同点和不同点:

  相同点:两者在构造学习目标的时候,都是以特征图上的point为出发点的。(每个point都会对应原图一个固定的区域,也就是感受野)

  不同点:Anchor-based是一种外生的视角,也就是我们从待检测目标的bounding box出发,认为每个point应该去适应什么样的目标物体,因此每个point都会有大小、宽高比不同的多个anchors去覆盖尽可能多的目标物体。比如下图

            在这里插入图片描述
然而Anchor-free是一种内生的视角,这意味着是从point本身的属性出发,它应该为哪一个bounding box负责,然后它就去预测那个bounding box,比如下图
            在这里插入图片描述
上图中point对应的感受野中心虽然同时落到了两个bounding box中,从直觉判断,它应该为橘色的bounding box负责,因为它更靠近橘色bounding box的中心。

举例:(以YOLO划分网格的思想,在anchor-free中,物体落到哪个网格,哪个网格就是正样本,其余都是负样本。anchor-based则计算每个anchor和gt的IoU,超过多少阈值就算正)

Anchor-based与Anchor-free的优劣:

  Anchor-based:
  缺点:超参数比较难调,代码的复杂度也高一些;
  优点:我觉得在于有一个基准的anchor,bounding box的回归相对简单一些,并且还有一个对手所没有的优势,就是它有单个point响应多个目标的能力。

  Anchor-free:
  优点:超参数较少,代码也更加简洁;
  缺点:bounding box的回归就相比较复杂一些,且单个point只能服务一个目标物。

38.关于roi pooling层

  在目标检测领域,分为Two-stage和One-stage,而roi pooling就是Two-stage中Fast-RCNN中用到的。

  什么是roi poling层
  ROI指的就是给定一张输入image找出objects可能存在的所有位置,这一阶段的输出应该是一系列object可能位置的bounding box,通常称之为region proposals或者 regions of interest(ROI)。

  roi pooling层提出的原因
  在第一阶段产生大量的候选框会影响模型的性能,很难达到实时的目标检测,没有办法做到端到端,这也就是Two-stage慢的原因。

  roi pooling层的特点
  输入特征图尺寸不固定,但是输出特征图尺寸固定。

  roi pooling层的具体操作
  ①根据输入image,将ROI映射到feature map对应位置;
  ②将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
  ③对每个sections进行max pooling操作;
这样我们就可以从不同大小的方框得到固定大小的相应 的feature maps,值得一提的是,输出的feature maps的大小不取决于ROI和卷积feature maps大小,ROI pooling 最大的好处就在于极大地提高了处理速度

  roi pooling层的作用
  ①用于目标检测任务
  ②允许对CNN的特征图(feature map)进行重复使用
  ③显著加速training和testing的速度
  ④允许end-to-end的形式训练目标检测系统。

  roi pool 和roi align 区别
  大体思路就是原本一张图像假设有一个目标框,经过池化之后可能会有小数,于是roi pool就选择了直接量化即丢弃了小数部分,则经过多次这样就会有很大的误差;但是roi align就选择取消量化,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。

39.mean pooling和max pooling的前向和反向传播

  mean pooling:假设pooling的窗大小是2x2, 在前向传播(forward)的时候,就是在前面卷积完的输出上依次不重合的取2x2的窗口然后取平均,得到一个值就是当前mean pooling之后的值。反向传播(backward)的时候,把一个值分成四等分放到前面2x2的格子里面就好了。比如:

forward: [1 3; 2 2] -> [2] 
backward: [2] -> [0.5 0.5; 0.5 0.5]

  max pooling:前向传播(forward)的时候你只需要把2x2窗子里面那个最大的那个值拿走就好了,反向传播(backward)的时候你要把当前的值放到之前那个最大的位置,其他的三个位置都弄成0。比如:

forward: [1 3; 2 2] -> 3 
backward: [3] -> [0 3; 0 0]

40.方差和协方差的理解

在这里插入图片描述

41.Python的数据类型有哪些?

(数字:int类)、(布尔值:bool类)、(字符串:str类)、(列表:list类)、(元组:tuple类)、(字典:dict类)、(集合:set类)

  列表,元组,字典,集合的区别:

  列表list []:列表是处理一组有序的数据结构,可以读写,添加和删除,或者搜索列表里的元素。因为可以添加和删除,所以称为可变的数据类型,即这种类型是可以被改变的,并且列表可以嵌套。

  元组tuple():元组跟列表非常相似,用()来表示,但是元组是不可变的,不能修改元组。元组可以嵌套。

  字典dict:字典是通过键值对的方式就数据存储下来,键必须是唯一的。
键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。另外,记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺 序,那么你应该在使用前自己对它们排序。

  集合(set):与字典类似,但只包含键,而没有对应的值,包含的数据不重复。

42.Python中is和==有什么区别?

  ①is用于判断两个变量引用对象是否为同一个,就是所引用的对象的内存地址是否一致。

  ②==用于判断引用变量的值是否相等,只判断值和数据类型。

43.Python中可变对象和不可变对象有哪些?

  可变对象:列表、字典、numpy数组,大多数用户定义的类型(类)也都是可变的。

  不可变对象:字符串、元组。

44.Python中删除的三种方法有什么区别?remove()、pop()、del

  ①remove()方法可根据值删除元素,若不知所要删除元素在列表中的位置时,可以用remove()删除,需要注意的是remove()所删除的元素是列表中第一个配对的值。

  ②pop()可删除任意位置的元素并将其返回,只需要在括号内指定要删除的元素的索引即可,当括号内为空时删除该列表最后一个元素并将其返回。

  ③del语句可以删除任何位置处的列表元素,若知道某元素在列表中的位置可用del语句。

Guess you like

Origin blog.csdn.net/qq_45445740/article/details/120645544