计算机视觉算法工程师面试准备
图像算法工程师面试常见题
- 基础
- 计算机基础
- 算法与数据结构
- 排序算法
- 操作系统
- linux常用指令
- shell脚本
- 深度学习框架
- tensorflow
- mxnet
- pytorch
- 分布式计算
- pytorch--nn.module
- 模型保存
- 深度学习基础概念
- 常见模型
- 开发工具/语言
- python
- 项目
(有空再整理,未完待续…)
基础
计算机基础
算法与数据结构
排序算法
操作系统
linux常用指令
shell脚本
深度学习框架
tensorflow
用数据流图来进行数值计算,数据流图是描述有向图的数值计算过程,有向图中的结点表示为数学运算,边表示传输多维数据,节点也可以被分配到多个设备,从而执行并行操作。
有server,worker,client。worker间是可以通信的,可以根据op的依赖关系主动收发数据。一个gpu负责一个或几个op的训练任务
mxnet
有两个主要的进程,server和worker,worker间不能进行通信,只能通过server互相影响。常用来做数据并行,每个gpu上包含所有的op
pytorch
分布式计算
DDP和DP的区别
DP(DataParallel)和DDP(DistributedDataParallel)两者都可以实现数据并行的分布式训练。
DP采用PS(Parameter Server)结构,一个gpu为server,将数据分到其他worker上,每个worker负责计算一个mini-batch,然后将梯度返回给server做累计,得到更新的权重参数后,再分发给各个卡。
PS的缺点:
1、每一轮迭代都需要所有卡数据同步完一次,并行的卡很多时,木桶效应严重,计算效率低。
2、受到server通信带宽的制约。
DDP采用Ring AllReduce:所有卡以环形相连,每张卡都有左手卡和右手卡,一个负责接收,一个负责发送,循环n-1次完成梯度累积,再循环n-1次做参数同步。分为Scatter Reduce和All Gather两个环节。
分布式训练详解
pytorch中分布式训练
DP分布式训练代码
import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.utils.data import Dataset, DataLoader
import os#定义dataloader(DP版本)
rand_loader = DataLoader(dataset=RandomDataset(input_size, data_size),batch_size=batch_size, shuffle=True)#1、将模型放到gpu上
if torch.cuda.is_available():model.cuda()#2、若有多个gpu则进行分布式计算
if torch.cuda.device_count() > 1:print("Let's use", torch.cuda.device_count(), "GPUs!")# DPmodel = nn.DataParallel(model)for data in rand_loader:if torch.cuda.is_available():#3、将data放到gpu上input_var = Variable(data.cuda())else:input_var = Variable(data)#4、执行模型前向运算output = model(input_var)
DDP分布式训练代码
DDP并不会自动share输入每个gpu的数据,
1、如果自己写数据流,需要根据torch.distributed.get_rank()获取可以使用的gpu序号,去share数据,获取自己应用的一份
2、 如果用Dataset API,则需要在定义Dataloader的时候用DistributedSampler 去share
import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.utils.data import Dataset, DataLoader
import os
from torch.utils.data.distributed import DistributedSampler
# 1) 初始化(gloo->对cpu进行分布式训练或nccl->对gpu进行分布式训练)
torch.distributed.init_process_group(backend="nccl")input_size = 5
output_size = 2
batch_size = 30
data_size = 90# 2) 配置每个进程的gpu
local_rank = torch.distributed.get_rank()
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)class RandomDataset(Dataset):def __init__(self, size, length):self.len = lengthself.data = torch.randn(length, size).to('cuda')def __getitem__(self, index):return self.data[index]def __len__(self):return self.lendataset = RandomDataset(input_size, data_size)
# 3)使用DistributedSampler
rand_loader = DataLoader(dataset=dataset,batch_size=batch_size,sampler=DistributedSampler(dataset))class Model(nn.Module):def __init__(self, input_size, output_size):super(Model, self).__init__()self.fc = nn.Linear(input_size, output_size)def forward(self, input):output = self.fc(input)print(" In Model: input size", input.size(),"output size", output.size())return outputmodel = Model(input_size, output_size)# 4) 封装之前要把模型移到对应的gpu
model.to(device)if torch.cuda.device_count() > 1:print("Let's use", torch.cuda.device_count(), "GPUs!")# 5) 封装model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[local_rank],output_device=local_rank)for data in rand_loader:if torch.cuda.is_available():input_var = dataelse:input_var = dataoutput = model(input_var)print("Outside: input size", input_var.size(), "output_size", output.size())
pytorch–nn.module
torch.nn:所有神经网络模块的基类
hook
为了获得中间变量varible或nn.module的输出
modulelist、list、sequential的区别
1、modulelist和list区别:
modulelist是将module注册进了网络,而list没有注册进网络,参数不更新。
2、modulelist和sequential的区别:
a)modulelist的顺序无所谓,forward函数需要自行定义。
sequential的顺序必须严格按照网络流的顺序,forward函数自动按照排列顺序计算
b)对于resnet等需要连接当前层和之间某层的结构,用modulelist比较方便。
nn.parameter的作用
将某个不可训练的tensor转化为可训练的parameter,使用这个函数的目的是想让某些变量在学习的过程中不断的修改其值以达到最优化。
卷积层
torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)
torch.nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)torch.nn.ConvTranspose1d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
torch.nn.ConvTranspose3d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1)
池化层
torch.nn.MaxPool1d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)
torch.nn.MaxPool3d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)torch.nn.MaxUnpool1d(kernel_size, stride=None, padding=0)
torch.nn.MaxUnpool2d(kernel_size, stride=None, padding=0)
torch.nn.MaxUnpool3d(kernel_size, stride=None, padding=0)torch.nn.AvgPool1d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
torch.nn.AvgPool2d(kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True)
torch.nn.AvgPool3d(kernel_size, stride=None)torch.nn.FractionalMaxPool2d(kernel_size, output_size=None, output_ratio=None, return_indices=False, _random_samples=None)
torch.nn.LPPool2d(norm_type, kernel_size, stride=None, ceil_mode=False)torch.nn.AdaptiveMaxPool1d(output_size, return_indices=False)
torch.nn.AdaptiveMaxPool2d(output_size, return_indices=False)torch.nn.AdaptiveAvgPool1d(output_size)
torch.nn.AdaptiveAvgPool2d(output_size)
激活函数
torch.nn.ReLU(inplace=False)
torch.nn.ReLU6(inplace=False)
torch.nn.ELU(alpha=1.0, inplace=False)
torch.nn.PReLU(num_parameters=1, init=0.25)
torch.nn.LeakyReLU(negative_slope=0.01, inplace=False)
torch.nn.Threshold(threshold, value, inplace=False)
torch.nn.Hardtanh(min_value=-1, max_value=1, inplace=False)torch.nn.Sigmoid
torch.nn.Tanh
torch.nn.LogSigmoid
torch.nn.Softplus(beta=1, threshold=20)
torch.nn.Softshrink(lambd=0.5)
torch.nn.Softsign
torch.nn.Softshrink(lambd=0.5)
torch.nn.Softmin
torch.nn.Softmax
torch.nn.LogSoftmax
normalization
torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True)
torch.nn.BatchNorm2d(num_features, eps=1e-05, momentum=0.1, affine=True)
torch.nn.BatchNorm3d(num_features, eps=1e-05, momentum=0.1, affine=True)
RNN
torch.nn.RNN(* args, ** kwargs)
LSTM
torch.nn.LSTM(* args, ** kwargs)
torch.nn.conv2d和torch.nn.functional.conv2d的区别
模型保存
两种方式
torch.save(model.state_dict(),PATH)
torch.save(model,PATH)
深度学习基础概念
1、激活函数
作用:增加网络的非线性表达能力。
激活函数发展及对比
softmax,tanh,relu,prelu,elu(sigmoid+relu)
2、反向传播,梯度消失,梯度爆炸
反向传播:损失loss对各个参数求导,利用链式法则,逐层求导。
注意:参数进行随机初始化而不是全部置0,置0的话在前向传播的过程中,计算出的结果也为0,反向传播求导也为0,无法进行梯度下降。
3、ROI POOLING和ROI ALIGN
ROI POOLING和ROI ALIGN区别
都是用于将feature映射到同一尺寸;
区别在于:ROI POOLING使用的是实际像素值;而ROI ALIGN提出了利用线性插值计算虚拟像素值。
4、nms softnms softernms
算法思想及实现代码
5、BN,GN,IN,LN
异同点
- BN(Batch Norm):对batch中对应的channel维度进行归一化,[N,C,W,H]->[N,W,H]
- LN(Layer Norm):对batch size N进行归一化,[N,C,W,H]->[C,W,H]
- IN(Instance Norm):对batch size N和channel C进行归一化,[N,C,W,H]->[W,H]
- GP(Group Norm):介于LN和IN之间,分别对batch size中N进行分组归一化,[N,C,W,H]->[C//G,W,H]
6、深度学习backbone的发展过程,优缺点
发展过程
LeNet->AlexNet->ZFNet
VGGNet->GoogleNet(Inception)
ResNet(残差网络)->DenseNet
7、梯度消失、梯度爆炸
对激活函数求导,如果大于1,层数增多时,累积的梯度将以指数形式增加,发生梯度爆炸。如果小于1,层数增多时,累积的梯度将以指数形式衰减,发生梯度消失。
由于链式法则的传播,导致前面的层参数更新会受到后面梯度的影响。
梯度消失:在反向传播过程中,靠近输入的层参数更新非常慢,梯度太小。主要是由于激活函数,如sigmoid在输入偏离0点时,梯度很小,经过几层传播后梯度就越来越小,导致靠前参数更新慢,梯度消失。
梯度爆炸:在反向传播过程中,靠近输入的层参数更新过快,震荡。
这两者都是因为网络层数过深以及激活函数选择的问题。
解决方法:
- 使用relu,leakyrelu,elu等激活函数
- BN
- ResNet残差结构
- 减少网络深度
- 预训练加finetunning
- 正则化(可用来限制梯度爆炸的情况)
8、batch size的设置
batch size过大,对内存要求大,跑完一个epoch所需要的迭代次数少,到达到同等精度需要花费的时间长。
batch size过小,样本随机性比较大,难以收敛。
6、优化器
7、数据增强
- color jittering:对颜色的数据增强。亮度、饱和度、对比度、RGB通道。
- random crop
- random scale
- 水平/垂直翻转
- 平移
- noise
- mosaic-部分拼接
8、过拟合、欠拟合
过拟合:在训练集上表现很好,但在测试集上表现不好。过度学习训练集特征,泛化性不好。
解决方法: - 早停止:如在训练中多次迭代后发现模型性能没有显著提高就停止训练
- 正则化-惩罚项减少网络复杂度
- 交叉验证
- dropout/减少网络深度
- 数据增强-增加训练样本数量
欠拟合:在训练集上表现不好
解决方法: - 增加网络层数
- 增加训练epoch
9、网络不收敛的原因
- 没有对数据进行归一化;
- 没有对数据进行预处理;
- 没有对数据正则化;
- 使用过大的样本;
- 使用不正确的学习率;
- 在输出层使用错误的激活函数;
- 网络中包含坏梯度;
- 初始化权重错误;
10、损失函数
常用分类损失函数
交叉熵
11、反卷积、空洞卷积
12、RNN,LSTM
13、网络调参技巧
14、模型改进技巧
ACNet:1x3+3x1卷积
15、模型量化方法,对比
背景:将深度学习模型量化为更小的定点模型和更快的推理速度,而且几乎不会有精度的损失;
定义:将网络中连续取值或离散取值的浮点型参数(权重或张量)线性或非线性映射为定点近似的整形离散值。同时保持输入输出为浮点型,减少模型尺寸大小、减少模型内存消耗以及加快模型推理速度。
对称量化和非对称量化
非对称量化能够较好的处理数据正负分布不均匀的情况
模型量化及pytorch实现
16、网络不收敛的问题
1、没有对数据集进行归一化
2、batchsize过小,部分数据差异较大,造成震荡;batchsize过大,会造成梯度下降随机性降低,容易陷入局部最小值
3、网络太深,出现梯度消失或梯度爆炸
4、参数初始化有问题
5、网络存在坏梯度,如relu对于负数梯度为0,反向传播时不更新
6、激活函数不对
7、学习率过大或者过小,过大会造成震荡,过小容易陷入局部最小值
8、数据集标签有问题
常见模型
目标检测
anchor系列:
onestage:
YOLO系列
twostage:
RCNN系列
SSD系列
SSD和YOLOv3区别
anchor free:
centernet
开发工具/语言
python
python生成器
项目
计算机视觉算法工程师面试准备相关推荐
- Interview:人工智能岗位面试—人工智能职位之计算机视觉算法工程师的简介、知识结构、发展方向之详细攻略
Interview:人工智能岗位面试-人工智能职位之计算机视觉算法工程师的简介.知识结构.发展方向之详细攻略 目录 计算机视觉算法工程师的简介 计算机视觉算法工程师的知识结构 计算机视觉算法工程师的发 ...
- 记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)
转载过来的,原文:https://www.cnblogs.com/aoanng/p/9581612.html 求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加 ...
- 第一篇博客--记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)...
求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加有点自闭... 前段时间在校内网上看到了陌陌科技内推计算机视觉算法工程师和机器学习算法工程师的消息,抱着试试的 ...
- 算法工程师面试问题及相关资料集锦(附链接)
来源:专知 本文约9800字,建议阅读20分钟. 本文为你介绍算法工程师面试问题及相关资料集锦,相当全面,值得收藏. 目录 算法工程师 Github.牛客网.知乎.个人博客.微信公众号.其他 机器学习 ...
- 决战春招!算法工程师面试问题及资料超详细合集(算法岗面经/代码实战/网课/竞赛等)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! Awesome-AI-algorithm 目录 算法面试 1. Github 20 ...
- 2022秋招计算机视觉算法工程师面经(旷视、字节、科大讯飞、大华、海康、网易、华为、小米、腾讯、百度、阿里、完美世界、美团、陌陌)
打个小广告~博主签了小米,面试小米请填写我的内推码!! NTAN8wx 可以私信我免费简历指导哈(不过我也比较菜不一定能提出有用的建议)~ 首先是小建议环节:如果你还有时间,尽量能写出一篇论文,面试的 ...
- 年薪20万和50万的计算机视觉算法工程师,到底有什么区别?
文末扫码,受邀加入计算机视觉垂直方向的交流群 计算机视觉是目前AI在中国落地最广泛的技术.国内计算机视觉企业达140余家,预计未来三年我国计算机视觉市场仍将保持100%以上的速度增长,2020年行业市 ...
- 阿里巴巴达摩院招聘计算机视觉算法工程师和实习生
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入->CV微信技术交流群 阿里巴巴达摩院招聘计算机视觉算法工程师和实习生 阿里巴巴达摩院 阿里巴 ...
- Shopee招聘计算机视觉算法工程师
点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 社招: [电商业务]计算机视觉算法工程师 Marketplace Intelligence 研发类 工作地点 ...
最新文章
- Spring Mybatis实例SqlSessionDaoSupport混用xml配置和注解
- 检测到磁盘可能为uefi引导_重装系统win10提示磁盘布局不受UEFI固件支持怎么办...
- android 大文本存储,Android操作文件存储信息 利用SharedReference存储信息(获取SDCARD大小)...
- ASP.NET生成WORD文档服务器部署注意事项
- java运行字符串代码
- js 转php json string,JS里字符串转json方法总结
- NFC身份证识别(一)
- 一键生成合成微信好友墙
- 个人认为比较有意思的文章
- 搭建 Asp.net 云服务器
- Glide学习(二)—缓存策略
- 用Python控制Kinect相机
- 移动终端3D地图应用普及或带来app产业心蓝海
- NRF24L01实验(STM32F103ZE与STM32L475ZE通信)
- 普华i-VirtualApp应用交付系统介绍
- 机器学习各研究领域综述汇总!
- vue+openlayers实现行政边界、标注交互、效果弹窗
- 基于AR的实时算法在虚拟屏幕上播放视频及实现
- 传说她是清华大学校花或重庆工商大学校花
- 字符串(中文英文)转二进制及二进制转回字符串(中文英文)--加密准备