简历上写项目的流程:

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

面试需要准备的内容:

一.项目描述与项目细节提问

主要描述项目背景,项目实现的功能与方法流程等,面试官会针对细节进行提问,所以项目是要反复打磨的

二.深度学习的八股

说是八股,但除了一些目标检测模型的发展,原理,各种问题的出现原因与处置方式以外,还有很多东西可以称得上是经验之谈,所以这部分对于算法工程师来说依然是很重要的

三.模型部署相关

模型格式转化,框架转化,浮点数在计算机中的存储问题,知识蒸馏问题,模型量化,GEMM优化等

四.编程语言相关

C++语言的了解深度,python语言与Pytorch等的了解深度与使用情况等

五.数据结构与算法

手撕代码没什么可说的

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放缩再与遗忘门数据再相乘一次,才是隐层的输出。。。但是细胞状态就不变了。

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

1.数据读取-图像

- cv2.IMREAD_COLOR:彩色图像
- cv2.IMREAD_GRAYSCALE:灰度图像

import cv2 #opencv读取的格式是BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
#可以减少plt.show()操作img=cv2.imread('cat.jpg') #读取图像

查看一下图像

img #H*W*C
array([[[142, 151, 160],[146, 155, 164],[151, 160, 170],...,[156, 172, 185],[155, 171, 184],[154, 170, 183]],[[108, 117, 126],[112, 123, 131],[118, 127, 137],...,[155, 171, 184],[154, 170, 183],[153, 169, 182]],[[108, 119, 127],[110, 123, 131],[118, 128, 138],...,[156, 169, 183],[155, 168, 182],[154, 167, 181]],...,[[162, 186, 198],[157, 181, 193],[142, 166, 178],...,[181, 204, 206],[170, 193, 195],[149, 172, 174]],[[140, 164, 176],[147, 171, 183],[139, 163, 175],...,[169, 187, 188],[125, 143, 144],[106, 124, 125]],[[154, 178, 190],[154, 178, 190],[121, 145, 157],...,[183, 198, 200],[128, 143, 145],[127, 142, 144]]], dtype=uint8)
def cv_show(name,img):# 封装起来前面几行#图像的显示,也可以创建多个窗口cv2.imshow('image',img)# 等待时间,毫秒级,0表示任意键终止cv2.waitKey(0)cv2.destroyAllWindows()

转换灰度图,就会变成单通道了

img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE) #读取灰度图,转换方式暂时不说
  • 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又可以减少很多计算量。

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

  1. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(4)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  2. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(8)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  3. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(1)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  4. 最新前端开发面试笔试题及答案---图片(面试题系列持续更新中)(3)

    推荐文章: VUE之VUEX常见面试题大全汇总--史上最全[vuex面试题] 前端面试题之HTML+CSS(持续更新)_勤动手多动脑少说多做厚积薄发-CSDN博客1.行内元素和块级元素?img算什么? ...

  5. 【面经二】拼多多、字节跳动、触宝、平安证券等公司算法工程师面试问题集锦

    互联网 触宝 状态 已拿到offer 一面 介绍推荐系统项目 最大的技术难点是什么,如何解决 数据结构题 从海里数据中快速匹配字符串前缀 不记得了(一共有两题算法题) 二面 如何进行软件组的任务分配 ...

  6. 微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)

    1.什么是落地SOA(面向服务架构)? SOA面向服务架构,是一种架构思想,是跨语言和平台的.SOA宗旨简单明了,根据项目服务完成架构搭建,以服务为基准点完成组件化和模块化.提供服务是项目的基本内容, ...

  7. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  8. 算法工程师面试问题及相关资料集锦(附链接)

    来源:专知 本文约9800字,建议阅读20分钟. 本文为你介绍算法工程师面试问题及相关资料集锦,相当全面,值得收藏. 目录 算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 机器学习 ...

  9. 机器学习算法工程师面试集锦(更新中)

    机器学习算法工程师面试集锦(更新中) 面试问题汇总 常用的损失函数 介绍交叉验证 特征选择方法 机器学习项目的一般步骤 经验风险最小化与结构风险最小化 训练决策树时的参数是什么 在决策树的节点处分割标 ...

最新文章

  1. SEGGER RTT STOP/SLEEP 模式下使用
  2. 【总结整理】JQuery基础学习---DOM篇
  3. 【整理总结】Visual Studio 扩展和更新
  4. 每日文献:2018-01-11
  5. Boost:无序的bimap双图的测试程序
  6. troubleshoot之:用control+break解决线程死锁问题
  7. html评论置顶功能,微信公众号精选留言评论怎么置顶显示?功能在哪里设置?...
  8. mysql5.5 mysqli_php5.5.38增加mysqli扩展
  9. php获取周几,php怎么获得星期几
  10. (11)DJBX33A APR哈希默认算法
  11. Android 系统(67)---android apk 的root 权限和USB adb 权限的区别
  12. 白帽黑客眼中的网络安全 挡黑客财路曾收恐吓信
  13. mysql十三期_《叶问》第13期
  14. C语言来实现链表创建
  15. Eighth season eighth episode,Monica got a stripper in her bachelorette party??????
  16. Microsoft SQL Server 生成随机数字、字符串、日期、验证码以及 UUID
  17. excel 文件加密
  18. 1253寻找肇事司机
  19. 自动化设备远程监控系统软件
  20. SharedPreferences的使用与Sqlite的使用

热门文章

  1. 响应式的车牌登记页面
  2. 唱好铁血丹心谐音正规_蒙古语唱铁血丹心
  3. 看英文pdf文档屏幕取词
  4. 系统集成项目管理工程师未来发展前景:
  5. Dell戴尔灵越Inspiron 15 3511原装出厂系统恢复原厂系统
  6. 又来读者言论 [ 光影人像 东海陈光剑 的博客 ]
  7. spotify使用教程_如何在Google Home中使用Spotify
  8. Spring Boot集成Hprose
  9. 分布式电商项目——12.对接银联支付和支付宝支付
  10. 大数据风控---身份反欺诈信贷全流程常用指标及策略