2022算法岗秋招面试总结——CV基础(二)

又来更新啦,好久没面试了,把去年记得的再来回忆一遍,给大家分享,顺便给自己做好笔记,方便以后复习,哪里不对的地方,欢迎指正。
在这里插入图片描述

1、二维姿态估计中,基于回归与基于热图的方法有什么区别,为什么选基于热图的方法?

  1. 全卷积的结构能够完整地保留位置信息,因此高斯热图的空间泛化能力更强。而回归方法因为最后需要将图片向量展开成一个长长的一维向量,reshape过程中会对位置信息有所丢失。除此之外,全联接网络需要将位置信息转化为坐标值,对于这种隐晦的信息转化过程,其非线性是极强的,因此不好训练和收敛。
  2. 关节点之间存在相互联系。以脖子和肩膀为例,这两个地方常常会挨得比较近,因此空间上是存在相关性的。高斯热图可以在一张图中保留这种相关性,因此已知脖子的位置可以帮助估计肩膀,而已知肩膀的位置也能帮助估计脖子。但是,回归坐标时是对k个坐标点分别回归的,没办法照顾到这种关节间的相关性。
  3. 高斯热图有点类似分类问题中的软标注。它在目标位置上加上了一个渐进的分布过程,这能帮助网络更平滑地找到梯度下降的过程。同时软标注也减轻了在标注有误情况下的过拟合情况。

2、过拟合如何解决?L1正则为什么能使参数稀疏,从导数的角度阐述?

过拟合:模型在训练集上拟合得很好,但是模型连噪声的特征也学习进去了,丧失了对测试集的泛化能力。

解决措施:
1、重新清洗数据;
2、增加训练样本数量。可以通过一些数据增强的手段来扩充数据,比如图像的平移、旋转、缩放等方式,也可以通过GAN网络来生成许多新数据;
3、降低模型的复杂度。在网络中可以减少网络层数,使得模型不会拟合过多的噪声数据;
4、dropout。在训练的时候让神经元以一定的概率失活;
5、增大学习率;
6、采用正则化的方法,在模型原来损失函数的基础上加上正则化约束;

引入L2正则后,损失函数在0处的导数不变​。而引入L1正则后,损失函数在0处的导数有一个突变。在原来导数处左右领域内若异号,则在0处会是一个极小值点。因此,优化时会优化到该极小值点处。

3、类别不平衡是如何去处理的?如果进行采样,策略是什么?

1、数据增强;
2、对少数类别数据进行过采样,多数类别数据进行欠采样;
典型的SMOTE算法是一种有效的过采样方法,它利用小众样本在特征空间的相似性来人工合成新样本
3、通过损失函数前面的系数来调节权重均衡;
4、使用新的评价指标。
Tips:建议训练之前可以查看一下数据的分布,如何两个类别的数据分布相差过大,也就是数量相比都大于10倍了,这种情况的话,小数目的类别基本是训不到的,建议重新训练该类别

4、介绍一下常见的注意力机制

  • 1、Squeeze and Excitation
    SE注意力机制包括两个步骤:Squeeze和Excitation。在Squeeze步骤中,通过全局平均池化操作将输入特征图压缩成一个向量,然后通过一个全连接层将其映射到一个较小的向量。在Excitation步骤中,使用一个sigmoid函数将这个向量中的每个元素压缩到0到1之间,并将其与原始输入特征图相乘,得到加权后的特征图。通过SE注意力机制,模型可以自适应地学习到每个通道的重要性,从而提高模型的表现能力。
    在这里插入图片描述
  • 2、Convolutional Block Attention Module
    CBAM用于自适应地调整关注图像中的关键区域。
    CBAM注意力机制由两个模块组成:通道注意力模块和空间注意力模块。通道注意力模块用于学习每个通道的重要性,使得网络更多地关注那些有意义的特征,同时消除那些无意义的特征。这个模块的输入是一个卷积层的输出,输出是经过权重归一化之后的特征图。
    具体地,对于每个通道,通道注意力模块使用全局平均池化操作来得到一个特征向量,然后通过两个全连接层学习该通道的重要性,并对最终的卷积层输出进行加权。
    空间注意力模块用于学习图像的不同空间区域的重要性,即在不同位置上的注意力权值。这个模块的输入是卷积层的输出,输出是通过空间维度上的卷积操作和全连接操作,产生的每个空间位置的注意力矩阵。这个矩阵能够自适应地调整感受野大小并关注图像中的关键区域。
    在这里插入图片描述
  • 3、Efficient Channel Attention(ECA)
  • ECA主要是通过对图像通道进行注意力调控,提高图像特征表示的有效性。具体来说,ECA注意力机制模型由两部分组成:全局平均池化和线性变换。全局平均池化可以对每个通道的信息进行汇聚,从而判断该通道中的信息是否关键;线性变换可以将通道的信息进行缩放和平移,使得关键信息得到更好的保留,非关键信息得到抑制。如果某个通道的信息对于图像表现并不关键,则可以对其进行抑制,以提高其他通道的表现。ECA注意力机制相比于其他注意力机制模型的优势在于其模型复杂度低、计算效率高、效果好。因此,它被广泛应用于图像分类、目标检测和图像分割等领域。
  • 在这里插入图片描述

5、讲讲训练的时候你面临的问题已经如何解决的?

  • 当在训练学生试卷上手写体和印刷体的时候,手写体学习的很好,印刷体一直学习不到,后来通过debug将输入图片数据增强的图片都画出来检查,发现一开始马赛克的时候,图片整合和图片上的标注框都没有问题,原来是eval的时候开始灰度增强,也就是将手写体和印刷体都灰度化了,所以验证的时候就手写和印刷都不认识了。
  • 训练了10个epoch的时候,发现loss震荡的很厉害,检查学习率,设置的是3e-4,建议修改为3e-5,学习率小一点,带来的训练时间会变长,但是模型训练下来会越来越稳定,因为针对于我训练数据较多的话,lr还是小一点好,让模型慢慢学,慢慢收敛,学习率如果一开始设置得很大,可能loss会急剧下降,但是训着训着就会震荡的很厉害,难收敛。所以建议根据不同的任务,一开始设置学习率warm,然后每个epoch学习率衰减0.9,这个0.9根据自己的情况。
  • 模型训练完,加载权重进行图片检测的时候,一般模型预测出来的结果都是几万个,所以先有一个置信度阈值过滤,然后根据图片中预测框的最大数目Top_k再一次根据置信度由大到小一次排序过滤,这个Top_k建议一开始设置的大一点,可以有效避免最后检测出来漏框的情况,接下来就是nms阈值过滤,设置得过大,图片中会出现框重叠啊,一些没用的框,设置得过小,一些类别就出现漏检,所以根据每个任务实际考虑。

6、模型训练的时候如何加快数据读取?

由于训练的数据是放在数据库中的,也就是MongoDB,将图片数据信息,图片id,图片中框的左上角坐标和宽高,以及框的类别信息等等,因此我们可以建立索引id。
点击创建索引
在这里插入图片描述
然后这里选择你的图片id顺序,这样训练读取的时候通过id就可以直接拿到图片,有点类似于字典的形式,读取很快。
在这里插入图片描述
这里选择1(asc)
在这里插入图片描述
这里勾选index name,填入你的id
在这里插入图片描述

7、为什么U-Net在医学图像上表现这么好?

由于器官本身结构固定并且语义信息不是很丰富,因此高级语义信息和低级分辨率特征显得很重要。

  • 深层信息:经过多次下采样后的低分辨率信息。能够提供分割目标在整个图像中上下文语义信息,可理解为反应目标和它的环境之间关系的特征。这个特征有助于物体的类别判断。(所以分类问题通常只需要低分辨率/深层信息,不涉及多尺度融合)
  • 浅层信息:经过concatenate操作从encoder直接传递到同高度decoder上的高分辨率信息。能够为分割提供更加精细的特征。

8、训练网络的时候怎么判断有没有过拟合、欠拟合?怎么解决的

1、最直观的还是观察训练的loss曲线,如果训练loss曲线一直下降,验证集的loss一直上升,那就是过拟合了。
解决方法:

  • 根据每个特定的任务,观察自己的训练数据量是否足够,如果不够的话,建议增加数据,这是最快解决的;
  • 如果发现模型过拟合,建议停止训练,模型已经学坏了,可以保存一下 best checkpoints;
  • 检查自己的数据,如果是检测任务,可以将送到模型中的图片还没有经过self.net()的,也就是在前期预处理阶段,将图片以及上面的框画出来看一下,是否一开始框和图片大小会不会有误;
  • 数据增强;
  • 最后就是自己搭建的网络,特别是有堆叠的神经层,会很复杂,容易导致过拟合,可以添加dropout,特别是在全连接层后面。
    2、训练集和验证集的准确率一直都很低,欠拟合了。
    面向的场景比较复杂,但是模型比较简单,建议搭建更复杂的网络。
    其他解决方法和过拟合有点类似。

9、为什么self-attention可以堆叠多层,有什么作用?

在处理图像问题时,每一个像素点都可以看成一个三维的向量,维度就是图像的通道数,所以图像也可以看成是很多向量输入的模型。
自注意力机制和CNN的概念类似,都是希望网络不仅仅考虑某一个向量,也就是CNN中希望模型不仅仅考虑某一个像素点,而是让模型考虑一个正方形或者矩形的感受野(Receptive field),对于自注意力机制来说,相当于模型自己决定receptive field是怎样的形状和类型。
Self-attention可以考虑全部的输入,可以并行计算,而RNN不同层之间具有先后顺序。

10、介绍一下神经网络的初始化的方法?

  • 随机初始化(Random Initialization):将权重和偏置随机地初始化为较小的随机值。这可以打破对称性,并为神经元提供不同的起点,促进网络的多样性和学习能力。常见的随机初始化方法包括从均匀分布或高斯分布中随机采样。但是会带来训练不稳定、对称性和梯度消失或爆炸的问题;
  • Xavier初始化(Xavier Initialization):也称为Glorot初始化,它是一种针对全连接层的参数初始化方法。它根据前一层和后一层神经元的数量来计算权重的初始范围。具体而言,根据梯度的传播和信号的稳定性考虑,Xavier初始化将权重初始化为均匀分布或高斯分布中的较小随机值。它有助于保持输入信号和梯度的方差在不同层之间大致相等

11、为什么Transformer要用LayerNorm?

在这里插入图片描述
batch_norm是对蓝色平面上求均值和方差,同时让模型自己学习γ、β,BN广泛运用于CNN中处理图像任务;
但是在NLP任务中,我们需要对不同数据的同一个位置的token向量计算 均值与方差,在句子长短不一的情况下,BN无法很好地处理文本数据长度不一的问题,因此LN应运而出,他是对CN平面的单个词向量求均值和方差,整体做法类似于BN,不同的是LN不是在特征间进行标准化操作(横向操作),而是在整条数据间进行标准化操作(纵向操作)。

训练和测试过程中的Layer Norm
LN使得各条数据间在进行标准化的时候相互独立,因此LN在训练和测试过程中是一致的。LN不需要保留训练过程中的 均值与方差 ,每当来一条数据时,对这条数据的指定范围内单独计算所需统计量即可

12、mongoDB数据库几种操作?

  • 插入文档insert_one()
    比如插入一条字典数据new_dict,insert_one(new_dict)
  • 查询数据 find()
data = path.find({'grade': "一年级", 'subject': '语文', 'similarity':{'$gt': 0.7}, 'exam_position': {'$exists': False}})
$gt 表示查询大于0.7的数据
$exists 表示查询没有‘exam_position’的数据
最终得到的是个生成器,防止生成器中的数据全部取完,可以转成列表赋值给另外一个变量。
  • 更新文档
path.update_one({'base_id': res['base_id']}, {'$set': {'exam_position': most_common_number}})
在path中的'base-id': res['base_id']下,更新一条数据,使用$set 增加'exam_position': most_common_number这条数据,如果是update_many 则在'base-id': res['base_id']下更新所有的数据

这些是工作中比较常用的几种操作

13、开始训练模型之前都需要做哪些准备?

  1. 整理训练数据
    我们可以从数据库中拿取数据,将拿到的数据保存成我们训练可以读取的数据,比如有图片,图片中训练框的坐标信息以及框所属的类别信息;

  2. 检查数据
    可以从几步入手,将整理好的训练数据,将图片中的框在图片中画出来检查标注的框是否正确,确保不会出现框空白区域或者框的位置不对这些脏数据
    还应该统计一下训练类别的数目,确保数据类别是均衡的,一般如果一个类别的数目:另一个类别的数据,比值大于10:1的话,大概率小类别是训不到的;

  3. 确保数据没问题后,开始训练之前,开始debug,将图片送到网络之前查看图片以及其中的框是否正确,output = self.net(inputs),也就是inputs里面会有图片和图片中框的信息,可以画出来看一下是否正确。

  4. 根据训练图片的数量设定合适的学习率,我这边图片数目是5万张,学习率设定的是2e-6,学习率尽量小点儿,大不了训练的时间久点儿,根据自己的实际情况设定学习率如果是上百万张图片,500-1000万张的话,学习率可以设定为2e-4啥的,并且可以先在此学习率的基础上先训练,如果发现损失往下降了,建议每个epoch开始学习率衰减,衰减0.95 0.9 0.85根据自己的情况设定。

  5. 如果学习率设定得太大的话,很多特征学着学着就跳过了,模型接着训的话就训坏了

  6. 几种常用的数据增强:马赛克数据增强、Mixup、随机旋转90度、垂直翻转、水平翻转、图片转任意角度、转HSV、图片上像素点归一化等等,根据自己的需求开启

14、Lion优化器介绍

1、基于进化算法自动发现神经网络优化器是一种使用进化算法来搜索和生成新的神经网络优化器的方法。这种方法通过对神经网络优化器的组成部分进行随机变异,以及对它们的性能进行评估和选择,来逐步改进优化器的性能。在这个过程中,优化器的性能被用作适应度函数,用于指导进化算法的搜索方向。通过这种方法,可以发现具有更好性能和更高效的神经网络优化器,以及用于特定任务和数据集的优化器。与传统的手工设计优化器相比,这种方法可以提供更高的性能和更好的泛化能力。
特性

  • Sign Update: Sign Update是Lion优化器最大的特性。Lion优化器使用了Sign函数忽略了梯度的长度,只保留的梯度的方向。从而在优化过程中在一定程度上起到了正则化的效果。
  • 动量维护:Lion在权重更新和动量维护中的历史梯度权重是由两个超参数[Math Processing Error]
    和[Math Processing Error]分别控制的。分别控制非常关键,这允许Lion以更大的[Math Processing Error]
    更新模型,并以更小的[Math Processing Error]保留更多历史梯度信息。
  • 超参数设置:由于Lion采用Sign函数结果进行更新,因此Lion的梯度更新尺度会比一般的优化器要更大。因此,Lion需要配合比较小的学习率使用。而与此同时,由于学习率比较小,Weight Decay的权重则需要相应适当增大。
  • 低内存:由于Lion仅仅维护了一个动量信息,因此Lion的内存消耗比AdamW更少。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值