- CV相关的基础知识点总结
CV基础
- 1.为什么需要做特征归一化、标准化?
- 2.常用的归一化和标准化的方法有哪些?
- 3.介绍一下空洞卷积的原理和作用
- 4.怎么判断模型是否过拟合,有哪些防止过拟合的策略?
- 5.除了SGD和 Adam之外,你还知道哪些优化算法?
- 6.上采样的原理和常用方式
- 7.下采样的作用是什么?通常有哪些方式?
- 8.模型的参数量指的是什么?怎么计算?
- 9.深度可分离卷积的概念和作用
- 10.神经网络中Addition / Concatenate区别是什么?
- 11.激活函数是什么?你知道哪些常用的激活函数?
- 12.随机梯度下降相比全局梯度下降好处是什么?
- 13.如果在网络初始化时给网络赋予0的权重,这个网络能正常训练吗?
- 14.为什么要对网络进行初始化,有哪些初始化的方法?
- 15.梯度消失和梯度爆炸的原因是什么?
- 16.深度学习中的 batch 的大小对学习效果有何影响?
- 17.PyTorch 和 TensorFlow 的特点分别是什么?
- 18.数据不平衡的解决方法
- 19.为什么 max pooling 要更常用?什么场景下 average
- 20.为什么在模型训练开始会有 warm up?
- 21.训练过程中,若一个模型不收敛,那么是否说明这个模型无效?导致模型不收敛的原因有哪些?
- 22.GAN 网络的思想
- 23.Attention 机制的作用
- 24.怎么提升网络的泛化能力
1.为什么需要做特征归一化、标准化?
- 使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确
- 加快学习算法的收敛速度
2.常用的归一化和标准化的方法有哪些?
- 线性归一化(min-max标准化)
x' = (x-min(x)) / (max(x)-min(x))
,其中 max 是样本数据的最大值,min是样本数据的最小值适用于数值比较集中的情况,可使用经验值常量来来代替max,min - 标准差归一化(z-score 0均值标准化)
x'=(x-μ) / σ
,其中μ为所有样本的均值,σ为所有样本的标准差经过处理后符合标准正态分布,即均值为0,标准差为1 - 非线性归一化 使用非线性函数log、指数、正切等,如
y = 1-e^(-x)
,在x∈[0,6]变化较明显,用在数据分化比较大的场景
3.介绍一下空洞卷积的原理和作用
空洞卷积(Atrous Convolution)也叫做膨胀卷积、扩张卷积,最初的提出是为了解决图像分割在用下采样(池化、卷积)增加感受野时带来的特征图缩小,后再上采样回去时造成的精度上的损失。
空洞卷积通过引入了一个扩张率的超参数,该参数定义了卷积核处理数据时各值的间距。
可以在增加感受野的同时保持特征图的尺寸不变,从而代替下采样和上采样,通过调整扩张率得到不同的感受野不大小:
- a.是普通的卷积过程(dilation rate = 1),卷积后的感受野为3
- b.是 dilation rate = 2的空洞卷积,卷积后的感受野为5
- c.是 dilation rate = 3的空洞卷积,卷积后的感受野为8可以这么说,普通卷积是空洞卷积的一种特殊情况
4.怎么判断模型是否过拟合,有哪些防止过拟合的策略?
在构建模型的过程中,通常会划分训练集、测试集。
当模型在训练集上精度很高,在测试集上精度很差时,模型过拟合;
当模型在训练集和测试集上精度都很差时,模型欠拟合。
预防过拟合策略:
- 增加训练数据:获取更多数据,也可以使用图像增强、增样等;
- 使用合适的模型:适当减少网络的层数、降低网络参数量;
- Dropout:随机抑制网络中一部分神经元,使的每次训练都有一批神经元不参与模型训练;
- L1、L2正则化:训练时限制权值的大小,增加惩罚机制,使得网络更稀疏;
- 数据清洗:去除问题数据、错误标签和噪声数据;
- 限制网络训练时间:在训练时将训练集和验证集损失分别输出,当训练集损失持续下降,而验证集损失不再下降时,网络就开始出现过拟合现象,此时就可以停止训练了;
- 在网络中使用BN层(Batch Normalization)也可以一定程度上防止过拟合。
5.除了SGD和 Adam之外,你还知道哪些优化算法?
主要有三大类:
- a.基本梯度下降法,包括GD,BGD,SGD;
- b.动量优化法,包括Momentum,NAG等;
- c.自适应学习率优化法,包括Adam,AdaGrad,RMSProp等。
6.上采样的原理和常用方式
在卷积神经网络中,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(如图像的语义分割),这个使图像由小分辨率映射到大分辨率的操作,叫做上采样,它的实现一般有三种方式:
- a.插值,一般使用的是双线性插值,因为效果最好,虽然计算上比其他插值方式复杂,但是相对于卷积计算可以说不值一提,其他插值方式还有最近邻插值、三线性插值等;
- b.转置卷积又或是说反卷积,通过对输入feature map间隔填充0,再进行标准的卷积计算,可以使得输出feature map 的尺寸比输入更大;
- c. Max Unpooling,在对称的max pooling位置记录最大值的索引位置,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0。
7.下采样的作用是什么?通常有哪些方式?
下采样层有两个作用,一是减少计算量,防止过拟合;二是增大感受野,使得后面的卷积核能够学到更加全局的信息。
下采样的方式主要有两种:
- a.采用stride为2的池化层,如 Max-pooling和 Average-pooling,目前通常使用Max-pooling,因为他计算简单而且能够更好的保留纹理特征;
- b.采用stride为2的卷积层,下采样的过程是一个信息损失的过程,而池化层是不可学习的,用stride为2的可学习卷积层来代替pooling可以得到更好的效果,当然同时也增加了一定的计算量。
8.模型的参数量指的是什么?怎么计算?
参数量指的是网络中可学习变量的数量,包括卷积核的权重weights,批归一化(BN)的缩放系数γ,偏移系数β,有些没有BN 的层可能有偏置bias,这些都是可学习的参数,即在模型训练开始前被赋予初值,在训练过程根据链式法则不断迭代更新,整个模型的参数量主要是由卷积核的权重weights的数量决定,参数量越大,则该结构对平台运行的内存要求越高。
参数量的计算方式:
Kh x Kw x Cin x Cout (Conv卷积网络)
Cin x Cout (FC全连接网络)
9.深度可分离卷积的概念和作用
深度可分离卷积将传统的卷积分两步进行,分别是 depthwise和 pointwise。首先按照通道进行计算按位相乘的计算,深度可分离卷积中的卷积核都是单通道的,输出不能改变featuremap 的通道数,此时通道数不变;然后依然得到将第一步的结果,使用1*1的卷积核进行传统的卷积运算,此时通道数可以进行改变。
计算量的前后对比
:
Kh x Kw x Cin x Cout x H × w
变成了
Kh x Kw x Cin x H x W + 1×1 x Cin x Cout x Hx w
10.神经网络中Addition / Concatenate区别是什么?
Addition和 Concatenate分支操作统称为shortcut,Addition是在 ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和 addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。
11.激活函数是什么?你知道哪些常用的激活函数?
激活函数(又叫激励函数,后面就全部统称为激活函数)是模型整个结构中的非线性扭曲力,神经网络的每层都会有一个激活函数。
常用的激活函数: Sigmoid 函数、tanh函数、Relu 函数、Leaky ReLU函数(PReLU) 、ELU(Exponential Linear Units)函数、MaxOut函数。
12.随机梯度下降相比全局梯度下降好处是什么?
- 当处理大量数据时,比如SSD或者faster-rcnn等目标检测算法,每个样本都有大量候选框参与训练,这时使用随机梯度下降法能够加快梯度的计算;
- 每次只随机选取一个样本来更新模型参数,因此每次的学习是非常快速的,并且可以进行在线更新。
13.如果在网络初始化时给网络赋予0的权重,这个网络能正常训练吗?
不能,因为初始化权重是0,每次传入的不同数据得到的结果是相同的,网络无法更新。
14.为什么要对网络进行初始化,有哪些初始化的方法?
权重初始化的目的是在深度神经网络中前向传递时,阻止网络层的激活函数输出爆炸(无穷大)或者消失(O)。
如果网络层的输出爆炸或者消失,损失函数的梯度也会变得很大或者很小,无法有效后向传递,使得神经网络需要更长的时间才能收敛甚至无法收敛。
初始化方法有: Xavier初始化、Kaiming 初始化、随机初始化。
15.梯度消失和梯度爆炸的原因是什么?
原因:激活函数的选择。
梯度消失:令bias=O,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较小时,则权重参数呈指数级减小。
梯度爆炸:令bias=0,则神经网络的输出结果等于各层权重参数的积再与输入数据集相乘,若参数值较大时,则权重参数呈指数级增长。
16.深度学习中的 batch 的大小对学习效果有何影响?
一般来说,在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小;batch size 如果过大,则可能会出现内存爆表和局部最优的情况。小的 bath size 引入的随机性更大, 难以达到收敛,极少数情况下可能会效果变好。
17.PyTorch 和 TensorFlow 的特点分别是什么?
-
TensorFlow 与 PyTorch 编程方式不同
-
PyTorch:命令式编程;TensorFlow:符号式编程
-
图的创建及调试不同
pytorch 图结构的创建是动态的,即图是运行时创建;更易调试 pytorch 代码,调试 pytorch代码就像调试 python 代码一样,可以利用 pdp 在任何地方设置断点灵活性、设备管理不同
tensorflow 图结构的创建是静态的,即图首先被"编译",然后在运行;不易调试要么从会话请求检查变量,要么学习使用 tfdbg 调试器
18.数据不平衡的解决方法
- 欠采样
随机删除观测数量足够多的类,使得两个类别间的相对比例是显著的。虽然这种方法使用起来非常简单,但很有可能被我们删除了的数据包含着预测类的重要信息。 - 过采样
对于不平衡的类别,我们使用拷贝现有样本的方法随机增加观测数量。理想情况下这种方法给了我们足够的样本数,但过采样可能导致过拟合训练数据。 - 合成采样( SMOTE )
该技术要求我们用合成方法得到不平衡类别的观测,该技术与现有的使用最近邻分类方法很类似。问题在于当一个类别的观测数量极度稀少时该怎么做。比如说,我们想用图片分类问题确定一个稀有物种,但我们可能只有一幅这个稀有物种的图片。 - 在 loss 方面
采用 focal loss 等 loss 进行控制不平衡样本。
19.为什么 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 操作,使输入数据变成一位向量。
20.为什么在模型训练开始会有 warm up?
warm up在刚刚开始训练时以很小的学习率进行训练,使得网络熟悉数据,随着训练的进行学习率慢慢变大,到了一定程度,以设置的初始学习率进行训练,接着过了一些inter 后,学习率再慢慢变小;
学习率变化:上升——平稳——下降
- 有助于减缓模型在初始阶段对 mini-batch 的提前过拟合现象,保持分布的平稳;
- 有助于保持模型深层的稳定性。
21.训练过程中,若一个模型不收敛,那么是否说明这个模型无效?导致模型不收敛的原因有哪些?
并不能说明这个模型无效,导致模型不收敛的原因可能有:
- 数据分类的标注不准确,样本的信息量太大导致模型不足以 fit 整个样本空间
- 学习率设置的太大容易产生震荡,太小会导致不收敛
- 可能复杂的分类任务用了简单的模型
- 数据没有进行归一化的操作
22.GAN 网络的思想
GAN 用一个生成模型和一个判别模型,判别模型用于判断给定的图片是不是真实的图片, 生成模型自己生成一张图片和想要的图片很像,开始时两个模型都没有训练,然后两个模型一起进行对抗训练,生成模型产生图片去欺骗判别模型,判别模型去判别真假,最终两个模型在训练过程中,能力越来越强最终达到稳态。
23.Attention 机制的作用
减少处理高维输入数据的计算负担,结构化的选取输入的子集,从而降低数据的维度。让系统更加容易的找到输入的数据中与当前输出信息相关的有用信息,从而提高输出的质量。
帮助类似于 decoder 这样的模型框架更好的学到多种内容模态之间的相互关系。
24.怎么提升网络的泛化能力
从数据上提升性能:
收集更多的数据,对数据做缩放和变换,特征组合和重新定义问题。
从算法调优上提升性能:
用可靠的模型诊断工具对模型进行诊断,权重的初始化,用小的随机数初始化权重。
对学习率进行调节:
尝试选择合适的激活函数,调整网络的拓扑结构,调节batch 和epoch 的大小,添加正则化的方法,尝试使用其它的优化方法,使用early stopping