计算机视觉面试常见问题(含解答)
最近忙着找实习,对计算机视觉中常见的问题做了简单梳理,会不定时更新。
CNN
CNN在图像上表现好的原因
直接将图像数据作为输入,不仅无需人工对图像进行预处理和额外的特征抽取等复杂操作,而且以其特有的细粒度特征提取方式,使得对图像的处理达到了几近人力的水平。
参数和计算量的计算
卷积输入为 W×H×C,卷积核 K×K×N,输出 W1×H1×C1
- 计算量: W1×H1×C1×K×K×C
- 参数量: C1×K×K×C
调试、修改模型的经验
-
数据层面
获取更多的数据、数据扩增或生成、对数据进行归一化或者标准化、重新进行特征选择 -
算法层面
对算法进行抽样调查。选取性能最好的算法,然后通过进一步的调参和数据准备来提升。
重采样方法。可以先在小数据集上完成模型选择和参数调优,然后再将最终的方法扩展到全部数据集上。
- 调参
诊断。在每个周期, 评估模型在训练集和验证集上的表现, 并作出图表;
权重初始化。尝试所有不同的初始化方法,考察是否有一种方法在其他情况不变的情况下(效果)更优;
学习率。尝试随周期递减的学习率或增加动量项;
激活函数。尝试常见的激活函数,并且重缩放你的数据以满足激活函数的边界;
Batch size和周期。尝试不同的批次 batch size 和周期数,batch size 大小会决定最后的梯度, 以及更新权重的频度。
正则化。尝试不同的正则化方式,权重衰减(Weight decay) 去惩罚大的权重、激活约束(Activation constraint) 去惩罚大的激活值、分别在输入, 隐藏层和输出层中试验 dropout 方法或者使用L1、L2正则化。
优化算法和损失函数。尝试不同的优化算法(SGD、ADAM、RMSprop、、、)。要被优化的损失函数与你要解决的问题高度相关,也得适当调整。
Early Stopping/早停法。一旦训练过程中出现(验证集)性能开始下降, 你可以停止训练与学习,是避免模型在训练数据上的过拟合的正则化方式。
- 通过嵌套模型提升性能
通过组合多个“足够好的”模型来得到优秀的预测能力, 而不是通过组合多个高度调参的(脆弱的)模型。
简述 Inception v1-v4区别、改进
V1
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
- 将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性;
- 为了减少计算量,增加了1x1卷积。
V2
- 卷积分解,将单个的5x5卷积层用2个连续的3x3卷积层组成的小网络来代替,在保持感受野范围的同时又减少了参数量,也加深了网络。
- 提出了著名的Batch Normalization (BN) 方法。BN会对每一个mini-batch数据的内部进行标准化(normalization),使输出规范到N(0,1)的正态分布,加快了网络的训练速度,还可以增大学习率。
- BN某种意义上起到了正则化的作用,所以可以减少或者取消dropout,简化网络结构。V2在训练达到V1准确率时快了14倍,最后收敛的准确率也比V1高。
V3
- 考虑了nx1卷积核,将一个较大的二维卷积拆成两个较小的一维卷积(7x7拆成了7x1和1x7,3x3拆成了1x3和3x1),一方面节约了大量参数,加速运算并减轻了过拟合),同时网络深度进一步增加,增加了网络的非线性。
- 优化了Inception Module的结构。
V4
利用残差连接(Residual Connection)来改进V3结构。
Inception v1中的inception结构怎么设计的
- 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
- 该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
然而上面这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,约需要1.2亿次的计算量,造成了特征图的厚度很大。
3. 为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:
为什么使用1x1卷积核
- 1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
- 加深了网络的层次,同时也增强了网络的非线性。
简述 CNN 的演变
- LeNet:2个卷积3个全连接,最早用于数字识别
- AlexNet:12年ImageNet冠军,5个卷积3个全连接,多个小卷积代替单一大卷积;使用ReLU激活函数,解决梯度小数问题;引入dropout避免模型过拟合;最大池化。
- ZF-Net:13年ImageNet冠军,只用了一块 GPU 的稠密连接结构;将AlexNet第一层卷积核由11变成7,步长由4变为2。
- VGG-Nets:14年ImageNet分类第二名,更深的网络,卷积层使用更小的filter尺寸和间隔;多个小卷积让网络有更多的非线性,更少的参数。
- GoogLeNet:14年ImageNet分类第一名。引入Inception模块,采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;采用了average pooling来代替全连接层;避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。
- ResNet:引入残差单元,简化学习目标和难度,加快训练速度,模型加深时,不会产生退化问题;能够有效解决训练过程中梯度消失和梯度爆炸问题。
- DenseNet:密集连接;加强特征传播,鼓励特征复用,极大的减少了参数量。
讲一下CNN,每个层,及作用
CNN的特征检测层通过训练数据进行学习
- 所以在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习;
- 由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。
- 卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性。权值共享降低了网络的复杂性,特别是***输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。
卷积神经网络(CNN)主要由卷积层、激活函数、池化层、全连接层组成。
- 卷积层(Conv):使用卷积核进行特征提取和特征映射
- 激活函数(Activation):由于卷积也是一种线性运算,因此需要增加非线性映射
- 池化层(Pool):对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征
- 全连接层(FC):连接所有的特征,将输出值送给分类器
Pooling层怎么反向传播
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化(步长也为2),假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的
- mean pooling
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,图示如下 :
- max pooling
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :
解释 ResNet 流行的原因
从上面两个图可以看出,在网络很深的时候(56层相比20层),模型效果却越来越差了(误差率越高),并不是网络越深越好。
ResNet创造性的引入了残差单元,很好的解决了这个问题。
- 引入残差单元,简化学习目标和难度,加快训练速度,模型加深时,不会产生退化问题
- 引入残差单元,能够有效解决训练过程中梯度消失和梯度爆炸问题
Resnet第二个版本做了哪些改进
ResNet_v2与v1的最大区别就是v2的BN和ReLU是在卷积之前使用的,好处:
- 反向传播基本符合假设,信息传递无阻碍;
- BN层作为pre-activation,起到了正则化的作用;
mobileNet、shuffleNet知道吗?
- MobileNet是为移动和嵌入式设备提出的高效模型。MobileNets基于流线型架构(streamlined),使用深度可分离卷积(即Xception变体结构)来构建轻量级深度神经网络。宽度因子α用于控制输入和输出的通道数,分辨率因子ρ控制输入的分辨率。
例如,对于深度分离卷积,把标准卷积(4,4,3,5)分解为:
深度卷积部分:大小为(4,4,1,3),作用在输入的每个通道上,输出特征映射为(3,3,3)
逐点卷积部分:大小为(1,1,3,5),作用在深度卷积的输出特征映射上,得到最终输出为(3,3,5)
- shuffleNet专门应用于计算力受限的移动设备,主要包含2个操作:逐点群卷积(降低计算复杂度)和通道混洗(帮助信息流通)。
讲一下pooling的作用, 为什么max pooling要更常用?哪些情况下,average pooling比max pooling更合适?
- 作用:对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。
- 通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性。 pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,在分类问题中,我们需要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种情况下显然max pooling比average pooling更合适。在网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去。
- average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在信息的完整传递这个维度上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
average-pooling在全局平均池化操作中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近分类器的末端使用全局平均池化还可以代替Flatten操作,使输入数据变成一位向量。
哪些领域(数据集)不能使用深度学习?
- 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势
- 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。