CV算法工程师面试问题集锦,从基础到进阶,会介绍细节,持续更新中......

简历上写项目的流程:项目背景是什么?应用场景在什么地方?目的是什么?创造了什么价值?你做了什么事情?遇到困难时,又是怎么解决的?

模型部署:TensorRT部署,会讲一部分AI常用的C++的内容

Tensorflow

  • tensorflow2将Keras api作为核心,Keras就是将tensorflow中的很多方法进行了封装,更方便了,可以跨平台,由各种现成的模型。
  • Tensor就是多维的矩阵,tensorflow就是对矩阵进行处理的框架,可以通过GPU加速的矩阵。
  • 视觉任务中,遮蔽现象是一种常见的问题,现在已经被攻克了,比人类的识别能力还强。
  • 善于查阅Tensorflow的api文档,比如Tensorflow中的tf.keras模块中的layers模块,里面就有很多层的对象可以直接使用;
  • Keras的常规操作,可以选择激活函数,比如relu,可以对权重和bias进行初始化,初始化很神奇,有时候怎么都不收敛,换个初始化就收敛了,还可以加入正则化等
  • Sequential就是用来按顺序添加网络结构的,比如keras里的Sequential,可以直接add对应的层,不过一般我们也都是根据论文里的思想,用人家现成的网络结构,自己最多调调参
  • compile就是对网络进行配置,指定优化器比如随机梯度下降SGD、Adam等和损失函数比如回归就用mse,分类可以用交叉熵
  • 训练集效果好,验证集不好,就是过拟合了,准备正则化吧,在全连接层可以添加l1,l2范数,或者在全连接层加dropout也可以,keras中都可以实现
  • 神经网络其实就是一个特征提取器,中间的层就是在提前特征,最后用激活函数来实现分类或者回归
  • tf.data模块,比如Dataset可以将numpy转换成Tensor格式
  • 对于Dataset,可以用batch操作把它转化成对应batch大小的Tensor,shuffle可以进行洗牌a
  • 模型的保存,训练完的模型,直接save成h5文件就行,下次就不用训练了,直接加载就行,load_model就是加载模型,这都是keras的强大功能
  • to_json可以单独保存网络的结构,model_from_json就是读取网络的结构,save_weights和load_weights就是单独保存权重和读取权重
  • 读数据一般就是os.path.join
  • 影响运行速度的,batch_size,图像的size,常见的224*224*3
  • 对于输入为h*h*c的图像,选择F个卷积核,边缘填充Padding为P,步长为s,那么卷积完了输出的图像的宽h’ = (h-F+2P)/s +1,也就是输出的feature map是h’*h’*F的,这就是每次卷积的输出
  • 那还有个问题,权重参数怎么算,比如某个卷积层共有32个卷积核,卷积核是3*3的,图像是3通道的,那么每个卷积核实际上应该是3*3*3的,这就是27个参数,32个卷积核就是27*32,也就是864个参数,那还要每个feature map都有一个bias,也就是32个偏置参数,也就是864+32,就是896个参数,这就是一个卷积层的参数个数的算法,参数个数很大程度上影响了训练的速度
  • 那还想知道,池化层的参数有多少,记住,池化层没有参数,压根不需要参数啊,直接池化运算了
  • 还要全连接层,这个参数就比较大了,你最后拉直有多少个值,那就要有多少个参数哦。
  • Conv1D就是对向量做卷积,2D就是对矩阵也就是图像做卷积,3D一般用来处理视频,参数filters选取卷积核数量,其实就是要输出多少个feature map,kernel_size就是卷积核大小,还要步长,卷积网络的流程就是卷积-relu-池化-卷积-relu-池化-…-拉直-全连接层
  • ImageDataGenerator数据生成器,就是用来数据预处理的模块,它可以动态产生一个batch一个batch的数据进入内存中,进行处理,所以要指定batch_size,这里还要指定steps,也就是有多少个batch。。。就很无语,这还要指定,然后还要指定epoch,就是迭代次数,每个epoch都要跑完所有batch才行
  • 对于one-hot编码,就选择categorical,对于二分类,就选择binary就行
  • 数据增强,就是翻转,平移,对称,通道变换等操作,扩大样本量,解决过拟合问题,然后keras.preprocessing.image包中有这些方法
  • Keras中的Callback,相当于监视器,可以用来提前停止callbacks.EarlyStopping早停法,可以设置成连续几次epoch,loss没有下降就停止,动态改变学习率LearningRateScheduler
  • TFRecords是一种常用的二进制序列存储方法,tf.Examples可以用来读取、写入TFRecords数据,首先这比cpu读取数据要快,它可以把数据先直接处理成TFRecords格式,这样就不用一下一下处理了,直接统一处理完然后再直接一次次读取就行了
  • tf.Examples其实会把数据转化成类似于字典的格式,它可以存很多特征,比如对于一张图像来说,可以存它的长宽,通道数,已经像素点矩阵本身,都可以通过tf.io写入到文件中,类似于java中io流,读取该文件也可以tf.data中的函数读取就行
  • RNN就是先将第一个时刻的数据输入一个节点,然后将输出与下一时刻的数据一起在下一个节点进行处理,它体现了前后数据之间是有依赖的意义,它只能处理短期的依赖,但不能处理长期依赖,因为当序列太长时,梯度很难反向传播到前面,这就出现了梯度消失,但是LSTM可以解决这一问题。
  • LSTM有之前的隐层输出的状态h,之前的细胞状态c,这个细胞状态其实就是携带了对之前的记忆的,当然还有新时刻加入的数据x,首先将之前的隐层输出和新数据进行concate,得到[h,x],然后sigmoid成0-1的数据,越小越接近0呗,再与细胞状态进行对应位置相乘,这就叫遗忘门,什么是遗忘门,就是让不重要的部分(为0的)忘掉,记住重要的部分;下一步,让遗忘门数据再去与tanh激活函数归一化后的[h,x]对应位置相乘,啥意思,就是把tanh归一化过的[h,x]再选择性遗忘一部分数据;再然后,就叫遗忘门处理过的细胞状态c与遗忘门处理过的归一化[h,x]相加,就变成了新的细胞状态啦,它携带了以往的记忆,但也在这次数据加入后进行了新的更新;后面竟然还要用更新后的细胞状态进行tanh放缩再与遗忘门数据再相乘一次,才是隐层的输出。。。但是细胞状态就不变了。

CV算法工程师面试问题集锦,从基础到进阶,会介绍细节,持续更新中......_第1张图片

Pytorch

  • Caffe不更新了,而且配置文件非常麻烦,安装非常困难,不推荐。。。然后是Tensorflow1.x,这玩意说明书特别长,用起来要读好多文档,不方便。。。它定义比较严格,用起来就显得比较冗长。再然后是keras,因为tensorflow1.x的api太混乱了,keras在它的基础上进行了再封装,这下就方便了很多,keras的api就简洁了很多,大家都喜欢用,再然后谷歌把Keras收购了,推出了Tensorflow2.x,啥2.x,其实就是keras,但是好景不长,torch的python版本Pytorch推出了,这东西学习成本极低,又方便又好用,Tensorflow那一套接口,属实是不好用,所以推荐Pytorch,用的人多,达到90%都不为过,大家选择的就是好的,不过呢,如果做谷歌的开源项目,那可能还是要用Tensorflow。。。
  • 面向开源项目编程,Pytorch好用,也用得多,它更新后也变化比较少
  • torch.tensor将numpy格式转换成tensor格式

OpenCV

  • OpenCV已经实现了一些目标追踪算法,如KCF,叫自相关滤波,先解释相关滤波,其实就是对于视频中的第一帧来说,先框一个框,然后padding一下,扩出去的背景部分也是用来学习的,这就形成了一个滤波器,可以用来训练得到框的响应,但这不是一个简单的二分类问题,而是一个响应大小问题,框出来的框距离正样本(物体)越远,响应越低,根据当前帧训练出来的响应最小的框,就可以认为是下一帧要框的地方,但是下一次还要重新训练,重新寻找响应,以此类推,追踪下去

目标检测

Yolo-v1介绍

Yolo-v1算法相对RCNN算法是实现了端到端的算法,它只经过卷积神经网络就实现了目标检测,其原理如下:

首先对输入的图像Image进行Resize,论文用了GoogLeNet 作为神经网络主干,24层卷积层加上两层全连接层,Resize之后的图像传入GoogLeNet,输出时已经相当于进行了下采样,图像大小变小了很多,然后把输出的feature map切分成s*s的网格单元,每个网格单元关联着2个大小不一致的候选框,每个网格单元会计算出多个条件类别概率,数量就是类别数,但是最后只会预测一个类别。

当物体的中心在网格单元中时,才会去绘制该网格单元的边界框,那怎么判断物体的中心在网格单元上呢?这里是用confidence来衡量的,这个confidence如下:

其中IOU称为交并比,其含义如下:

意思就是物体的真实位置与候选框的位置的交集,比上它们的并集,这个指标会在候选框接近物体真实位置时变得越来越大,而Pr(object)在该网格单元中包含物体中心时为1,否则为0,所以confidence就需要在网格单元中包含物体中心的条件下,且候选框最接近真实物体时最大,最后选择confidence最大的候选框作为检测框即可。

Transformer在CV上的介绍

对于Transformer来说,它与卷积神经网络不同,它是以向量作为处理主体的,这就是Encoder层,Encoder层中的核心思想就是Self-Attention,所谓自注意力,其实就是与自己本身找相似性,在进入Encoder层之前需要先对图像Img进行划分,比如一个4*4*3的图像,可以划分成4个2*2*3的token,所谓token其实就是平均切分得来的,接着将token拉直成一个向量,通道也拉直,这就是4个向量,然后分别传进Encoder层,对向量进行三种线性变换,可以得到Q,K,V三个向量,注意,QKV的向量形状没有变化,利用当前token的Q向量分别与4个token(包括当前token)的K向量求内积,这里就是自注意力的体现了,因为它与自己也求了内积,再然后就得到了4个内积,再分别除以根号下的向量长度,这就是4个常数,然后进行softmax激活,得到的还是4个数值,与对应的V向量进行数乘,并相加得到输出向量,显然这个向量应该和一个token向量的长度一致,又因为有4个token向量输入,所以也有4个输出向量,输出向量与输入时的向量数量和向量大小都一样,这便完成了一次Encoder,可以进行多次Encoder,但是最终输出的就是最开始输入时一样的向量。

下一步,要随机生成一个与token向量一样长的向量,这就是随机生成就可以,将这个向量输入Encoder层,一样进行QKV变换,但是从前面输出的4个向量就不进行Self-Attention处理了,它们也进行QKV变换,但是仅仅是为了提供给随机生成的token向量使用,最后只输出该向量的Encoder结果即可,这就是相当于综合了前面4个token的整个信息,然后可以再进行一次MLP,也就是加深层数的处理,就采用全连接层的加深就行,最后通过softmax进行给出各个类别的概率,实现分类。

还有一个位置编码部分还在研究。。。

从Vision-Transformer到Axial-Transformer

将图像通过卷积进行划分,比如说,一张224*224*3的图像,通过768个16*16的卷积核进行卷积,最后输出的特征图就是14*14*768,那划分成多少个token呢,将14*14一下就是196,那就变成了196*768了,每个点都有768个通道,每个点都可以看出一个token了,token向量的元素数就是768,这就划分出了196个token向量了,然后传入Transformer中时,还分为Self-Attention1D和Self-Attention2D  ,所谓1D就是每个token只和其所在行的token进行Encoder运算,而2D就是和所有的Encoder进行运算,那其实2D就会运算速度慢,但是信息结合的就会比较全面,现在有论文提出Axial-Attention,让某个token先与其所在行的token进行Encoder操作,以结合该行的信息,以此类推,该token所在列的token们都会与其所在行的token进行Encoder操作,然后再让该token与其所在列的token进行Encoder操作,这样就可以结合到全局上的所有token的信息了,这样既可以结合所有token的信息,相比于2D又可以减少很多计算量。

你可能感兴趣的:(人工智能,深度学习,人工智能,计算机视觉)