大厂必考深度学习算法面试题(二)
十六,Overfitting 和 Underfitting 问题
16.1,过拟合问题怎么解决
首先所谓过拟合,指的是一个模型过于复杂之后,它可以很好地“记忆”每一个训练数据中随机噪音的部分而忘记了去“训练”数据中的通用趋势。训练好后的模型过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。解决办法如下:
数据增强
, 增加数据多样性;- 正则化策略:如 Parameter Norm Penalties(参数范数惩罚),
L1, L2正则化
; dropout
;- 模型融合, 比如Bagging 和其他集成方法;
BN
,batch normalization;- Early Stopping(提前终止训练)。
16.2,如何判断深度学习模型是否过拟合
- 首先将训练数据划分为训练集和验证集,
80%
用于训练集,20%
用于验证集(训练集和验证集一定不能相交);训练都时候每隔一定Epoch
比较验证集但指标和训练集是否一致,如果不一致,并且变坏了,那么意味着过拟合。 - 用学习曲线
learning curve
来判别过拟合,参考此博客。
16.3,欠拟合怎么解决
underfitting
欠拟合的表现就是模型不收敛,原因有很多种,这里以神经网络拟合能力不足问题给出以下参考解决方法:
- 寻找最优的权重初始化方案:如 He正态分布初始化
he_normal
,深度学习框架都内置了很多权重初始化方法; - 使用适当的激活函数:卷积层的输出使用的激活函数一般为
ReLu
,循环神经网络中的循环层使用的激活函数一般为tanh
,或者ReLu
; - 选择合适的优化器和学习速率:
SGD
优化器速度慢但是会达到最优.
16.4,如何判断模型是否欠拟合
神级网络欠拟合的特征就是模型训练了足够长但时间后, loss
值依然很大甚至与初始值没有太大区别,且精度很低,测试集亦如此。根据我的总结,原因一般有以下几种:
- 神经网络的拟合能力不足;
- 网络配置的问题;
- 数据集配置的问题;
- 训练方法出错(初学者经常碰到,原因千奇百怪)。
十七,L1 和 L2 区别
L1 范数(L1 norm
)是指向量中各个元素绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。 比如 向量 A=[1,-1,3], 那么 A 的 L1 范数为 |1|+|-1|+|3|。简单总结一下就是:
- L1 范数: 为向量 x 各个元素绝对值之和。
- L2 范数: 为向量 x 各个元素平方和的 1/2 次方,L2 范数又称 Euclidean 范数或 Frobenius 范数
- Lp 范数: 为向量 x 各个元素绝对值 次方和的 次方.
在支持向量机学习过程中,L1 范数实际是一种对于成本函数求解最优的过程,因此,L1 范数正则化通过向成本函数中添加 L1 范数,使得学习得到的结果满足稀疏化,从而方便人类提取特征。
L1
范数可以使权值参数稀疏,方便特征提取。 L2 范数可以防止过拟合,提升模型的泛化能力。
十八,TensorFlow计算图概念
Tensorflow
是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow 中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
十九,BN(批归一化)的作用
在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。
(1). 可以使用更高的学习率。如果每层的 scale
不一致,实际上每层需要的学习率是不一样的,同一层不同维度的 scale 往往也需要不同大小的学习率,通常需要使用最小的那个学习率才能保证损失函数有效下降,Batch Normalization 将每层、每维的 scale 保持一致,那么我们就可以直接使用较高的学习率进行优化。
(2). 移除或使用较低的 dropout
。 dropout 是常用的防止 overfitting 的方法,而导致 overfitting 的位置往往在数据边界处,如果初始化权重就已经落在数据内部,overfitting现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的 40%-50% 相比,可以大大提高训练速度。
(3). 降低 L2 权重衰减系数。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用 L2 衰减可以缓解这一问题,现在用了 Batch Normalization,就可以把这个值降低了,论文中降低为原来的 5 倍。
(4). 代替Local Response Normalization层。 由于使用了一种 Normalization,再使用 LRN 就显得没那么必要了。而且 LRN 实际上也没那么 work。
(5). Batch Normalization调整了数据的分布,不考虑激活函数,它让每一层的输出归一化到了均值为0方差为1的分布,这保证了梯度的有效性,可以解决反向传播过程中的梯度问题。目前大部分资料都这样解释,比如 BN 的原始论文认为的缓解了 Internal Covariate Shift(ICS) 问题。
关于训练阶段和推理阶段 BN
的不同可以参考 Batch Normalization详解 。
二十,什么是梯度消失和爆炸
- 梯度消失是指在深度学习训练的过程中,梯度随着
BP
算法中的链式求导逐层传递逐层减小,最后趋近于0,导致对某些层的训练失效; - 梯度爆炸与梯度消失相反,梯度随着
BP
算法中的链式求导逐层传递逐层增大,最后趋于无穷,导致某些层无法收敛;
在反向传播过程中需要对激活函数进行求导,如果导数大于 1,那么随着网络层数的增加,梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于 1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。
梯度消失和梯度爆炸产生的原因
出现梯度消失和梯度爆炸的问题主要是因为参数初始化不当以及激活函数选择不当造成的。其根本原因在于反向传播训练法则,属于先天不足。当训练较多层数的模型时,一般会出现梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。注意在反向传播中,当网络模型层数较多时,梯度消失和梯度爆炸是不可避免的。
深度神经网络中的梯度不稳定性,根本原因在于前面层上的梯度是来自于后面层上梯度的乘积。当存在过多的层次时,就出现了内在本质上的不稳定场景。前面的层比后面的层梯度变化更小,故变化更慢,故引起了梯度消失问题。前面层比后面层梯度变化更快,故引起梯度爆炸问题。
如何解决梯度消失和梯度爆炸问题
常用的有以下几个方案:
- 预训练模型 + 微调
- 梯度剪切 + 正则化
relu、leakrelu
等激活函数BN
批归一化- 参数标准初始化函数如
xavier
CNN
中的残差结构LSTM
结构
二十一,RNN循环神经网络理解
循环神经网络(recurrent neural network, RNN), 主要应用在语音识别、语言模型、机器翻译以及时序分析等问题上。
在经典应用中,卷积神经网络在不同的空间位置共享参数,循环神经网络是在不同的时间位置共享参数,从而能够使用有限的参数处理任意长度的序列。
RNN
可以看做作是同一神经网络结构在时间序列上被复制多次的结果,这个被复制多次的结构称为循环体,如何设计循环体的网络结构是 RNN 解决实际问题的关键。RNN 的输入有两个部分,一部分为上一时刻的状态,另一部分为当前时刻的输入样本。
二十二,训练过程中模型不收敛,是否说明这个模型无效,导致模型不收敛的原因
不一定。导致模型不收敛的原因有很多种可能,常见的有以下几种:
- 没有对数据做归一化。
- 没有检查过你的结果。这里的结果包括预处理结果和最终的训练测试结果。
- 忘了做数据预处理。
- 忘了使用正则化。
- Batch Size 设的太大。
- 学习率设的不对。
- 最后一层的激活函数用的不对。
- 网络存在坏梯度。比如 ReLu 对负值的梯度为 0,反向传播时,0 梯度就是不传播。
- 参数初始化错误。
- 网络太深。隐藏层神经元数量错误。
- 更多回答,参考此链接。
二十三,VGG 使用 2 个 3*3 卷积的优势
(1). 减少网络层参数。用两个 3*3 卷积比用 1 个 5*5 卷积拥有更少的参数量,只有后者的 2∗3∗3/5∗5=0.72。但是起到的效果是一样的,两个 3×3 的卷积层串联相当于一个 5×5 的卷积层,感受野的大小都是 5×5,即 1 个像素会跟周围 5×5 的像素产生关联。把下图当成动态图看,很容易看到两个 3×3 卷积层堆叠(没有空间池化)有 5×5 的有效感受野。
(2). 更多的非线性变换。2 个 3×3 卷积层拥有比 1 个 5×5 卷积层更多的非线性变换(前者可以使用两次 ReLU 激活函数,而后者只有一次),使得卷积神经网络对特征的学习能力更强。
paper中给出的相关解释:三个这样的层具有 7×7 的有效感受野。那么我们获得了什么?例如通过使用三个 3×3 卷积层的堆叠来替换单个 7×7 层。首先,我们结合了三个非线性修正层,而不是单一的,这使得决策函数更具判别性。其次,我们减少参数的数量:假设三层 3×3 卷积堆叠的输入和输出有 C 个通道,堆叠卷积层的参数为 3×(3×3C) = 27C
个权重;同时,单个 7×7 卷积层将需要 7×7×C = 49C
个参数,即参数多 81%。这可以看作是对 7×7 卷积滤波器进行正则化,迫使它们通过 3×3 滤波器(在它们之间注入非线性)进行分解。
此回答可以参考 TensorFlow 实战 p110,网上很多回答都说的不全。
23.1,1*1 卷积的主要作用
- 降维( dimension reductionality )。比如,一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积,那么结果的大小为500*500*20。
- 加入非线性。卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力;
二十四,Relu比Sigmoid效果好在哪里?
Sigmoid
函数公式如下:
ReLU激活函数公式如下:
ReLU 的输出要么是 0, 要么是输入本身。虽然方程简单,但实际上效果更好。在网上看了很多版本的解释,有从程序实例分析也有从数学上分析,我找了个相对比较直白的回答,如下:
ReLU
函数计算简单,可以减少很多计算量。反向传播求误差梯度时,涉及除法,计算量相对较大,采用ReLU
激活函数,可以节省很多计算量;- 避免梯度消失问题。对于深层网络,
sigmoid
函数反向传播时,很容易就会出现梯度消失问题(在sigmoid接近饱和区时,变换太缓慢,导数趋于 0,这种情况会造成信息丢失),从而无法完成深层网络的训练。 - 可以缓解过拟合问题的发生。
ReLU
会使一部分神经元的输出为 0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。 - 相比
sigmoid
型函数,ReLU
函数有助于随机梯度下降方法收敛。
参考链接
二十五,神经网络中权值共享的理解
权值(权重)共享这个词是由 LeNet5 模型提出来的。以 CNN 为例,在对一张图偏进行卷积的过程中,使用的是同一个卷积核的参数。
比如一个 3×3×1 的卷积核,这个卷积核内 9 个的参数被整张图共享,而不会因为图像内位置的不同而改变卷积核内的权系数。说的再直白一些,就是用一个卷积核不改变其内权系数的情况下卷积处理整张图片(当然CNN中每一层不会只有一个卷积核的,这样说只是为了方便解释而已)。
参考资料
二十六,对 fine-tuning(微调模型的理解),为什么要修改最后几层神经网络权值?
使用预训练模型的好处,在于利用训练好的SOTA模型权重去做特征提取,可以节省我们训练模型和调参的时间。
至于为什么只微调最后几层神经网络权重,是因为:
(1). CNN 中更靠近底部的层(定义模型时先添加到模型中的层)编码的是更加通用的可复用特征,而更靠近顶部的层(最后添加到模型中的层)编码的是更专业业化的特征。微调这些更专业化的特征更加有用,它更代表了新数据集上的有用特征。
(2). 训练的参数越多,过拟合的风险越大。很多SOTA模型拥有超过千万的参数,在一个不大的数据集上训练这么多参数是有过拟合风险的,除非你的数据集像Imagenet那样大。
参考资料
Python深度学习p127.
二十七,什么是 dropout?
- dropout可以防止过拟合,dropout简单来说就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率 p 停止工作,这样可以使模型的泛化性更强,因为它不会依赖某些局部的特征。
dropout
效果跟bagging
效果类似(bagging是减少方差variance,而boosting是减少偏差bias)- 加入dropout会使神经网络训练时间边长,模型预测时不需要dropout,记得关掉。
27.1,dropout具体工作流程
以 标准神经网络为例,正常的流程是:我们首先把输入数据x通过网络前向传播,然后把误差反向传播一决定如何更新参数让网络进行学习。使用dropout之后,过程变成如下:
1,首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图3中虚线为部分临时被删除的神经元);
2,然后把输入x通过修改后的网络进行前向传播计算,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b);
3,然后重复这一过程:
- 恢复被删掉的神经元(此时被删除的神经元保持原样没有更新w参数,而没有被删除的神经元已经有所更新);
- 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(同时备份被删除神经元的参数);
- 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
27.2,dropout在神经网络中的应用
(1). 在训练模型阶段
不可避免的,在训练网络中的每个单元都要添加一道概率流程,标准网络和带有dropout网络的比较图如下所示:
(2). 在测试模型阶段
预测模型的时候,输入是当前输入,每个神经单元的权重参数要乘以概率p。
27.3,如何选择dropout 的概率
input 的 dropout 概率推荐是 0.8, hidden layer 推荐是0.5, 但是也可以在一定的区间上取值。(All dropout nets use p = 0.5 for hidden units and p = 0.8 for input units.)
参考资料
- [Dropout:A Simple Way to Prevent Neural Networks from Overfitting]
- 深度学习中Dropout原理解析
二十八,HOG 算法原理描述
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。在深度学习取得成功之前,Hog特征结合SVM分类器被广泛应用于图像识别中,在行人检测中获得了较大的成功。
HOG特征原理
HOG
的核心思想是所检测的局部物体外形能够被光强梯度或边缘方向的分布所描述。通过将整幅图像分割成小的连接区域(称为cells),每个 cell
生成一个方向梯度直方图或者 cell 中pixel 的边缘方向,这些直方图的组合可表示(所检测目标的目标)描述子。
为改善准确率,局部直方图可以通过计算图像中一个较大区域(称为block)的光强作为 measure
被对比标准化,然后用这个值(measure)归一化这个 block 中的所有 cells 。这个归一化过程完成了更好的照射/阴影不变性。与其他描述子相比,HOG 得到的描述子保持了几何和光学转化不变性(除非物体方向改变)。因此HOG描述子尤其适合人的检测。
HOG 特征提取方法就是将一个image:
- 灰度化(将图像看做一个x,y,z(灰度)的三维图像)
- 划分成小
cells
(2*2) - 计算每个 cell 中每个 pixel 的 gradient(即 orientation)
- 统计每个 cell 的梯度直方图(不同梯度的个数),即可形成每个 cell 的 descriptor。
HOG特征检测步骤
总结:颜色空间归一化——>梯度计算——>梯度方向直方图——>重叠块直方图归一化———>HOG特征
参考资料
二十九,激活函数
29.1,激活函数的作用
- 激活函数实现去线性化。激活函数的引入是为了增加整个网络的表达能力(引入非线性因素),否则若干线形层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数。如果将每一个神经元(也就是神经网络的节点)的输出通过一个非线性函数,那么整个神经网络的模型也就不再是线性的了,这个非线性函数就是激活函数。
- 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
- 激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
29.2,常见的激活函数
激活函数也称非线性映射函数,常见的激活函数有:ReLU
函数、sigmoid
函数、tanh
函数等,其计算公式如下:
- ReLU函数:
- sigmoid函数:
- tanh函数:
29.3,激活函数理解及函数梯度图
Sigmoid
激活函数,可用作分类任务的输出层。可以看出经过sigmoid激活函数后,模型输出的值域被压缩到0到1
区间(这和概率的取值范围一致),这正是分类任务中sigmoid很受欢迎的原因。
tanh(x)
型函数是在sigmoid
型函数基础上为解决均值问题提出的激活函数。tanh 的形状和 sigmoid 类似,只不过tanh将“挤压”输入至区间(-1, 1)。至于梯度,它有一个大得多的峰值1.0(同样位于z = 0处),但它下降得更快,当|x|的值到达 3 时就已经接近零了。这是所谓梯度消失(vanishing gradients)问题背后的原因,会导致网络的训练进展变慢。
ReLU
处理了sigmoid、tanh中常见的梯度消失问题,同时也是计算梯度最快的激励函数。但是,ReLU函数也有自身缺陷,即在 x < 0 时,梯度便为 y。换句话说,对于小于 y 的这部分卷积结果响应,它们一旦变为负值将再无法影响网络训练——这种现象被称作“死区"。
三十,卷积层和池化层有什么区别
- 卷积层有参数,池化层没有参数;
- 经过卷积层节点矩阵深度会改变。池化层不会改变节点矩阵的深度,但是它可以缩小节点矩阵的大小。
三十一,卷积层和池化层参数量计算
参考 神经网络模型复杂度分析 文章。
三十二,神经网络为什么用交叉熵损失函数
判断一个输出向量和期望的向量有多接近,交叉熵(cross entroy
)是常用的评判方法之一。交叉熵刻画了两个概率分布之间的距离,是分类问题中使用比较广泛的一种损失函数。给定两个概率分布 p
和 q
,通过 q
来表示 p
的交叉熵公式为:
三十三,数据增强方法有哪些
常用数据增强方法:
- 翻转:
Fliplr,Flipud
。不同于旋转180度,这是类似镜面的翻折,跟人在镜子中的映射类似,常用水平、上下镜面翻转。 - 旋转:
rotate
。顺时针/逆时针旋转,最好旋转90-180
度,否则会出现边缘缺失或者超出问题,如旋转45
度。 - 缩放:
zoom
。图像可以被放大或缩小,imgaug库可用Scal函数实现。 - 裁剪:
crop
。一般叫随机裁剪,操作步骤是:随机从图像中选择一部分,然后降这部分图像裁剪出来,然后调整为原图像的大小。根本上理解,图像crop就是指从图像中移除不需要的信息,只保留需要的部分 - 平移:
translation
。平移是将图像沿着x或者y方向(或者两个方向)移动。我们在平移的时候需对背景进行假设,比如说假设为黑色等等,因为平移的时候有一部分图像是空的,由于图片中的物体可能出现在任意的位置,所以说平移增强方法十分有用。 - 放射变换:
Affine
。包含:平移(Translation
)、旋转(Rotation
)、放缩(zoom
)、错切(shear
)。 - 添加噪声:过拟合通常发生在神经网络学习高频特征的时候,为消除高频特征的过拟合,可以随机加入噪声数据来消除这些高频特征。
imgaug
图像增强库使用GaussianBlur
函数。 - 亮度、对比度增强:这是图像色彩进行增强的操作
- 锐化:
Sharpen
。imgaug库使用Sharpen函数。
33.1,离线数据增强和在线数据增强有什么区别?
数据增强分两类,一类是离线增强,一类是在线增强:
- 离线增强 : 直接对硬盘上的数据集进行处理,并保存增强后的数据集文件。数据的数目会变成增强因子 x 原数据集的数目 ,这种方法常常用于数据集很小的时候
- 在线增强 : 这种增强的方法用于,获得 batch 数据之后,然后对这个batch的数据进行增强,如旋转、平移、翻折等相应的变化,由于有些数据集不能接受线性级别的增长,这种方法长用于大的数据集,很多机器学习框架已经支持了这种数据增强方式,并且可以使用GPU优化计算。
`
Reference
三十四,ROI Pooling替换为ROI Align的效果,及各自原理
faster rcnn
将 roi pooling
替换为 roi align
效果有所提升。
ROI Pooling原理
RPN
生成的 ROI
区域大小是对应与输入图像大小(每个roi区域大小各不相同),为了能够共享权重,所以需要将这些 ROI
映射回特征图上,并固定大小。ROI Pooling操作过程如下图:
ROI Pooling
具体操作如下:
Conv layers
使用的是VGG16
,feat_stride=32
(即表示,经过网络层后图片缩小为原图的 1/32),原图 ,最后一层特征图feature map
大小:- 假定原图中有一
region proposal
,大小为 ,这样,映射到特征图中的大小: ,即大小为 ,源码中,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20*20; - 假定
pooled_w=7、pooled_h=7
,即pooling
后固定成 大小的特征图,所以,将上面在feature map
上映射的 的region proposal
划分成49
个同等大小的小区域,每个小区域的大小 ,,即 ,此时,进行第二次量化,故小区域大小变成 ; - 每个
的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49 个小区域就输出 49 个像素值,组成
大小的
feature map
。
所以,通过上面可以看出,经过两次量化,即将浮点数取整,原本在特征图上映射的
大小的 region proposal
,偏差成大小为
的,这样的像素偏差势必会对后层的回归定位产生影响。所以,产生了后面的替代方案: RoiAlign
。
ROI Align原理
ROI Align
的工作原理如下图。
ROI Align
是在 Mask RCNN
中使用以便使生成的候选框region proposal
映射产生固定大小的 feature map
时提出的,根据上图,有着类似的映射:
Conv layers
使用的是VGG16
,feat_stride=32
(即表示,经过网络层后图片缩小为原图的1/32),原图 ,最后一层特征图feature map大小: ;- 假定原图中有一region proposal,大小为
,这样,映射到特征图中的大小:
,即大小为
,此时,没有像
RoiPooling
那样就行取整操作,保留浮点数; - 假定
pooled_w=7,pooled_h=7
,即pooling
后固定成 大小的特征图,所以,将在feature map
上映射的 的region proposal
划分成 49 个同等大小的小区域,每个小区域的大小 ,即 ; - 假定采样点数为
4
,即表示,对于每个 的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图:
上图中,四个红色叉叉‘×’
的像素值是通过双线性插值算法计算得到的。
最后,取四个像素值中最大值作为这个小区域(即:
大小的区域)的像素值,如此类推,同样是 49
个小区域得到 49
个像素值,组成
大小的 feature map
。
RoiPooling 和 RoiAlign 总结
总结:知道了 RoiPooling
和 RoiAlign
实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择 RoiAlign
,更精准些。
Reference
三十五,CNN的反向传播算法推导
三十六,Focal Loss 公式
为了解决正负样本不平衡的问题,我们通常会在交叉熵损失的前面加上一个参数 ,即:
尽管
平衡了正负样本,但对难易样本的不平衡没有任何帮助。因此,Focal Loss
被提出来了,即:
实验表明
取 2
,
取 0.25
的时候效果最佳。
Focal loss
成功地解决了在单阶段目标检测时,正负样本区域极不平衡而目标检测loss
易被大批量负样本所左右的问题。RetinaNet
达到更高的精度的原因不是网络结构的创新,而是损失函数的创新!
三十七,快速回答
37.1,为什么 Faster RCNN、Mask RCNN 需要使用 ROI Pooling、ROI Align?
为了使得最后面的两个全连接层能够共享 conv layers(VGG/ResNet)
权重。在所有的 RoIs
都被 pooling
成(512×7×7)的feature map
后,将它 reshape
成一个一维的向量,就可以利用 VGG16
的预训练的权重来初始化前两层全连接。
37.2,softmax公式
37.3,上采样方法总结
上采样大致被总结成了三个类别:
- 基于线性插值的上采样:最近邻算法(
nearest
)、双线性插值算法(bilinear
)、双三次插值算法(bicubic
)等,这是传统图像处理方法。 - 基于深度学习的上采样(转置卷积,也叫反卷积
Conv2dTranspose2d
等) Unpooling
的方法(简单的补零或者扩充操作)
计算效果:最近邻插值算法 < 双线性插值 < 双三次插值。计算速度:最近邻插值算法 > 双线性插值 > 双三次插值
37.4,移动端深度学习框架知道哪些,用过哪些?
知名的有TensorFlow Lite、小米MACE、腾讯的 ncnn 等,目前都没有用过。
37.5,如何提升网络的泛化能力
和防止模型过拟合的方法类似,另外还有模型融合方法。
37.6,BN算法,为什么要在后面加伽马和贝塔,不加可以吗?
最后的 scale and shift
操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入。不加也可以。
37.7,验证集和测试集的作用
- 验证集是在训练过程中用于检验模型的训练情况,从而确定合适的超参数;
- 测试集是在模型训练结束之后,测试模型的泛化能力。
三十八,交叉验证的理解和作用
参考知乎文章 N折交叉验证的作用(如何使用交叉验证),我的理解之后补充。
三十九,介绍一下NMS和IOU的原理
NMS全称是非极大值抑制,顾名思义就是抑制不是极大值的元素。在目标检测任务中,通常在解析模型输出的预测框时,预测目标框会非常的多,其中有很多重复的框定位到了同一个目标,NMS 的作用就是用来除去这些重复框,从而获得真正的目标框。而 NMS 的过程则用到了 IOU,IOU 是一种用于衡量真实和预测之间相关度的标准,相关度越高,该值就越高。IOU 的计算是两个区域重叠的部分除以两个区域的集合部分,简单的来说就是交集除以并集。
在 NMS 中,首先对预测框的置信度进行排序,依次取置信度最大的预测框与后面的框进行 IOU 比较,当 IOU 大于某个阈值时,可以认为两个预测框框到了同一个目标,而置信度较低的那个将会被剔除,依次进行比较,最终得到所有的预测框。
Reference
- 点赞
- 收藏
- 关注作者
评论(0)