优势:
(1)BN使得网络中每层输入数据的分布相对稳定,加速模型学习速度
(2)BN使得模型对网络中的参数不那么敏感,简化调参过程,使得网络学习更加稳定
(3)BN允许网络使用饱和性激活函数(例如sigmoid,tanh等),缓解梯度消失问题
(4)BN具有一定的正则化效果
劣势:
(1)batch_size较小的时候,效果差
(2)RNN中效果差
(3)测试阶段
训练和测试
详细内容学习
空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本 3 × 3 3\times 3 3×3的卷积核,在相同参数量的情况下,用于 5 × 5 ( d i l a t e d r a t e = 2 ) 5 \times 5(dilated rate=2) 5×5(dilatedrate=2)或者更大的感受野,无须下采样。
存在问题:
详细内容学习
最近邻元法。最近邻像素即为替代像素的方法
二次插值法
已知(x1, y1, f (x1, y1)),(x1, y2, f (x1, y2)),(x2, y1, f (x2, y1)),(x2, y2, f (x2, y2))
用双线性插值估计 f(x, y):
先对 x 进行插值去求 f(x,y1) 和 f(x,y2):
f ( x , y 1 ) = f ( x 1 , y 1 ) ⋅ x 2 − x x 2 − x 1 + f ( x 2 , y 1 ) ⋅ x − x 1 x 2 − x 1 f\left(x, y_{1}\right)=f\left(x_{1}, y_{1}\right) \cdot \frac{x_{2}-x}{x_{2}-x_{1}}+f\left(x_{2}, y_{1}\right) \cdot \frac{x-x_{1}}{x_{2}-x_{1}} f(x,y1)=f(x1,y1)⋅x2−x1x2−x+f(x2,y1)⋅x2−x1x−x1
f ( x , y 2 ) = f ( x 1 , y 2 ) ⋅ x 2 − x x 2 − x 1 + f ( x 2 , y 2 ) ⋅ x − x 1 x 2 − x 1 f\left(x, y_{2}\right)=f\left(x_{1}, y_{2}\right) \cdot \frac{x_{2}-x}{x_{2}-x_{1}}+f\left(x_{2}, y_{2}\right) \cdot \frac{x-x_{1}}{x_{2}-x_{1}} f(x,y2)=f(x1,y2)⋅x2−x1x2−x+f(x2,y2)⋅x2−x1x−x1
然后再去求 f ( x , y ) f(x, y) f(x,y) :
f ( x , y ) = f ( x , y 1 ) ⋅ y 2 − y y 2 − y 1 + f ( x , y 2 ) ⋅ y − y 1 y 2 − y 1 f(x, y)=f\left(x, y_{1}\right) \cdot \frac{y_{2}-y}{y_{2}-y_{1}}+f\left(x, y_{2}\right) \cdot \frac{y-y_{1}}{y_{2}-y_{1}} f(x,y)=f(x,y1)⋅y2−y1y2−y+f(x,y2)⋅y2−y1y−y1
㓚果 x 2 = 1 , x 1 = 0 , y 2 = 1 , y 1 = 1 x_{2}=1, x_{1}=0, y_{2}=1, y_{1}=1 x2=1,x1=0,y2=1,y1=1, 那么:
f ( x , y ) = ( 1 − y ) ⋅ ( 1 − x ) ⋅ f ( 0 , 0 ) + ( 1 − y ) ⋅ x ⋅ f ( 1 , 0 ) + y ⋅ ( 1 − x ) ⋅ f ( 0 , 1 ) + y ⋅ x ⋅ f ( 1 , 1 ) f(x, y)=(1-y) \cdot(1-x) \cdot f(0,0)+(1-y) \cdot x \cdot f(1,0)+y \cdot(1-x) \cdot f(0,1)+y \cdot x \cdot f(1,1) f(x,y)=(1−y)⋅(1−x)⋅f(0,0)+(1−y)⋅x⋅f(1,0)+y⋅(1−x)⋅f(0,1)+y⋅x⋅f(1,1)
RoI Align 就行用的双线性插值对连续点利用周围的四个点进行双线性插值
详细学习链接
ohem
smiOTA
α \alpha α 平衡了正负样本数量,但实际上,目标检测中大量的候选目标都是易分样本,这些样本会使损失很低,因此模型应关注那些难分样本,将高置信度的样本损失函数降低一些,就有了Focal loss
F L = { − α ( 1 − p ) γ l o g ( p ) i f y = 1 − ( 1 − α ) p γ l o g ( 1 − p ) i f y = 0 FL = \left\{\begin{matrix} -\alpha(1-p)^{\gamma} log(p) & if \ y =1\\ -(1-\alpha)p^{\gamma} log(1-p) & if \ y =0 \end{matrix}\right. FL={−α(1−p)γlog(p)−(1−α)pγlog(1−p)if y=1if y=0
一些轻量级的网络,如mobilenet中,会有深度可分离卷积depthwise separable convolution,由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map
相比常规的卷积操作,其参数数量和运算成本比较低
卷积层共4个Filter,每个Filter包含了3个Kernel,每个Kernel的大小为3×3。因此卷积层的参数数量可以用如下公式来计算:
N_std = 4 × 3 × 3 × 3 = 108
深度可分离卷积
其中一个Filter只包含一个大小为3×3的Kernel,卷积部分的参数个数计算如下:
N_depthwise = 3 × 3 × 3 = 27
由于采用的是1×1卷积的方式,此步中卷积涉及到的参数个数可以计算为:
N_pointwise = 1 × 1 × 3 × 4 = 12
经过Pointwise Convolution之后,同样输出了4张Feature map,与常规卷积的输出维度相同
详细学习链接
将图一卷积的输入feature map分成组,每个卷积核也相应地分成组,在对应的组内做卷积,如上图2所示,图中分组数,即上面的一组feature map只和上面的一组卷积核做卷积,下面的一组feature map只和下面的一组卷积核做卷积。每组卷积都生成一个feature map,共生成个feature map。
输入每组feature map尺寸: ,共有组;
单个卷积核每组的尺寸:,一个卷积核被分成了组;
输出feature map尺寸:,共生成个feature map。
现在我们再来计算一下分组卷积时的参数量和运算量:
参数量
运算量
详细学习链接
(1)取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
(2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
(3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。
详细学习链接
知识蒸馏指的是将复杂模型(teacher)中的dark knowledge迁移到简单模型(student)中去,一般来说,teacher模型具有强大的能力和表现,而student模型则体量很小。通过知识蒸馏,希望student模型能尽可能逼近亦或是超过teacher模型,从而用更少的复杂度来获得类似的预测效果,实现模型的压缩和量化。
总结来说,知识蒸馏,可以将一个网络的知识转移到另一个网络。做法是先训练一个teacher网络,然后使用这个teacher网络的输出和数据的真实标签去训练student网络。知识蒸馏,可以用来将网络从大网络转化成一个小网络,并保留接近于大网络的性能;也可以将多个网络的学到的知识转移到一个网络中,使得单个网络的性能接近emsemble的结果。
详细学习链接
详细学习链接
联系
区别
结论
因此,像是需要将 A A A与 B B B的 T e n s o r Tensor Tensor进行融合,如果它们语义不同,则我们可以使用 C o n c a t Concat Concat的形式,如 U N e t UNet UNet, S e g N e t SegNet SegNet这种编码与解码的结构,主要还是使用 C o n c a t Concat Concat。
而如果 A A A与 B B B是相同语义,如 A A A与 B B B是不同分辨率的特征,其语义是相同的,我们可以使用 a d d add add来进行融合,如 F P N FPN FPN、 R e s N e t ResNet ResNet等网络的设计。
详细学习链接
CNN
两者目的都是减少参数。通过局部感受视野,通过卷积操作获取高阶特征,能达到比较好的效果。
池化的意义
1.特征不变形:池化操作是模型更加关注是否存在某些特征而不是特征具体的位置。
2.特征降维:池化相当于在空间范围内做了维度约减,从而使模型可以抽取更加广范围的特征。同时减小了下一层的输入大小,进而减少计算量和参数个数。
3.在一定程度上防止过拟合,更方便优化。
感受野( R e c e p t i v e Receptive Receptive F i e l d Field Field)的定义是卷积神经网络每一层输出的特征图( f e a t u r e feature feature m a p map map)上的像素点在原始输入图片上映射的区域大小。再通俗点的解释是,特征图上的一个点对应原始输入图片上的区域,如下图所示。
RF = 1 #待计算的feature map上的感受野大小
for layer in (top layer To down layer):
RF = ((RF -1)* stride) + fsize
stride 表示卷积的步长; fsize表示卷积层滤波器的大小
解决欠拟合:
解决过拟合:
原因
忘记对你的数据进行归一化
忘记检查输出结果
没有对数据进行预处理
没有使用任何的正则化方法
使用了一个太大的 batch size
使用一个错误的学习率
在最后一层使用错误的激活函数
网络包含坏的梯度
网络权重没有正确的初始化
使用了一个太深的神经网络
隐藏层神经元数量设置不正确
对应的解决办法分别是:
对数据进行归一化,常用的归一化包括零均值归一化和线性函数归一化方法;
检测训练过程中每个阶段的数据结果,如果是图像数据可以考虑使用可视化的方法;
对数据进行预处理,包括做一些简单的转换;
采用正则化方法,比如 L2 正则,或者 dropout;
在训练的时候,找到一个可以容忍的最小的 batch 大小。可以让 GPU 并行使用最优的 batch 大小并不一定可以得到最好的准确率,因为更大的 batch 可能需要训练更多时间才能达到相同的准确率。所以大胆的从一个很小的 batch 大小开始训练,比如 16,8,甚至是 1。
不采用梯度裁剪。找出在训练过程中不会导致误差爆炸的最大学习率。将学习率设置为比这个低一个数量级,这可能是非常接近最佳学习率。
如果是在做回归任务,大部分情况下是不需要在最后一层使用任何激活函数;如果是分类任务,一般最后一层是用 sigmoid 激活函数;
如果你发现你的训练误差没有随着迭代次数的增加而变化,那么很可能就是出现了因为是 ReLU 激活函数导致的神经元死亡的情况。可以尝试使用如 leaky ReLU 或者 ELUs 等激活函数,看看是否还出现这种情况。
目前比较常用而且在任何情况下效果都不错的初始化方式包括了“he”,“xaiver”和“lecun”。所以可以任意选择其中一种,但是可以先进行实验来找到最适合你的任务的权值初始化方式。
从256到1024个隐藏神经元数量开始。然后,看看其他研究人员在相似应用上使用的数字
RNN、LSTM…
总样本中,90%是正样本,10%是负样本。我们知道用准确率是有水分的,但是用TPR和FPR不一样。这里,TPR只关注90%正样本中有多少是被真正覆盖的,而与那10%毫无关系,同理,FPR只关注10%负样本中有多少是被错误覆盖的,也与那90%毫无关系,所以可以看出:如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用TPR和FPR作为ROC/AUC的指标的原因。
AUC-随机抽取一个阳性样本和一个阴性样本,分类器正确判断阳性样本的值高于阴性样本的概率 = AUC 。
AUC表示的是正例排在负例前面的概率。
比如上图,第一个坐标系的AUC值表示,所有的正例都排在负例的前面。第二个AUC值,表示有百分之八十的正例排在负例的前面。
学习混淆矩阵和Accuracy、Precision、Recall、F1 score、AP、mAP、IoU、mIoU、真阳率、假阳率
https://zhuanlan.zhihu.com/p/46714763
https://www.zhihu.com/question/39840928
https://blog.csdn.net/liweibin1994/article/details/79462554
标签平滑采用如下思路:在训练时即假设标签可能存在错误,避免“过分”相信训练样本的标签。当目标函数为交叉熵时,这一思想有非常简单的实现,称为标签平滑( L a b e l Label Label S m o o t h i n g Smoothing Smoothing)。
没有标签平滑计算的损失只考虑正确标签位置的损失,而不考虑其他标签位置的损失, 这就会出现一个问题,即不考虑其他错误标签位置的损失,这会使得模型过于关注增大预测正确标签的概率,而不关注减少预测错误标签的概率,最后导致的结果是模型在自己的训练集上拟合效果非常良好,而在其他的测试集结果表现不好,即过拟合,也就是说模型泛化能力差。
平滑过后的样本交叉熵损失就不仅考虑到了训练样本中正确的标签位置( o n e one one- h o t hot hot 标签为 1 1 1 的位置)的损失,也稍微考虑到其他错误标签位置( o n e one one- h o t hot hot 标签为 0 0 0 的位置)的损失,导致最后的损失增大,导致模型的学习能力提高,即要下降到原来的损失,就得学习的更好,也就是迫使模型往增大正确分类概率并且同时减小错误分类概率的方向前进。
详细学习链接
详细学习链接
batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
GroupNorm将channel分组,然后再做归一化;
SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法。
详细学习链接
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。原来多数的object detection算法都是只采用顶层特征做预测。FPN同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的。所以可以提升小目标的准确率。
y ( x i ) = 1 1 + e − x i y(x_i) = \frac{1}{1+e^{-x_i}} y(xi)=1+e−xi1
y ( x i ) = e x i ∑ j = 1 j = k e x j y(x_i) = \frac {e^{x_i}}{\sum_{j=1}^{j=k}e^{x_j}} y(xi)=∑j=1j=kexjexi
详细学习链接
详细学习链接
因为ROC曲线有很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。再实际数据中经常会出现样本类不平衡,即正负样本比例差距较大,而且测试数据中的正负样本可能随着时间变化。
简单地说,卷积+最大池化约等于平移不变性。
卷积:简单地说,图像经过平移,相应的特征图上的表达也是平移的。
池化:比如最大池化,它返回感受野中的最大值,如果最大值被移动了,但是仍然在这个感受野中,那么池化层也仍然会输出相同的最大值。
所以这两种操作共同提供了一些平移不变性,即使图像被平移,卷积保证仍然能检测到它的特征,池化则尽可能地保持一致的表达。
总结
对于大多数CNN网络,我们一般是使用L2-loss而不是L1-loss,因为L2-loss的收敛速度要比L1-loss要快得多。
对于边框预测回归问题,通常也可以选择方损失函数(L2损失),但L2范数的缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000决定。所以FastRCNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是方增长。
Smooth L1 和 L1 Loss 函数的区别在于,L1 Loss 在0点处导数不唯一,可能影响收敛。Smooth L1的解决办法是在 0 点附使用方函数使得它更加*滑。
Smooth L1的优点
相比于L1损失函数,可以收敛得更快。
相比于L2损失函数,对离群点、异常值不敏感,梯度变化相对更小,训练时不容易跑飞。
详细学习链接
常见的回归损失函数有:
分类问题的损失函数:
详细学习链接
L2损失能有效的衡量数据间的差异,数据差异越大损失越大,损失差异越小损失越小,但鲁棒性较差,受异常数据影响较大。并且在训练初期,损失会比较大,训练难度高。
L1损失的鲁棒性较好,损失较为稳定,但在训练后期,很能收敛到稳定值,且在0处的导数值不存在。
smoothL1能够融合了L2和L1损失各自的优点,趋利避害,能够实现较好的训练效果。但在目标检测中,并不是无关联的点进行损失计算这么简单,还要考虑边框之间的位置,距离等信息。smoothL1无法表达边框更高层次的信息。
IoU Loss能够去判断能够很好的计算边框之间的位置信息损失,解决了smoothL1的无边框损失的漏洞,但IoU无法去判断两个边框之间的距离信息,比如在两个边框无交集时,IoU无法判断边框之间的真正的距离信息。
GIoU Loss加入了外接边框边框信息,实现了无交集边框的距离计算,但在边框包含关系中退化为IoU loss,无法有效判断边框位置。
在认真审视了边框要素包括重叠面积,中心点距离,长宽比三方面后,DIoU Loss通过增加中心点距离和外界边框关系,改善了中心点距离和边框距离关系。
在DIoU Loss 基础上,CIoU Loss增加了长宽比信息,进一步满足了边框之间的信息要求,实现了训练回归框更快更好的Loss
IoU优点:
缺点:
v是用来衡量长宽比一致性的参数
α是用于做trade-off的参数
详细学习链接
详细学习链接
YOLOv1 将图像划分为sxs个网络,每个cell负责预测物体中心落在该网格中的Object。
每个网格预测b个bounding box,每个bounding box包含x,y,w,h和confidence信息
loss包括位置损失、置信度损失、类别损失三类,损失函数均为MSE
位置损失中提到 w \sqrt{w} w
整个网络较为简单,通过卷积提取到7x7x1024的feature map,然后2个全连接输出7x7x30的结果,当然,这是在VOC数据集,图像被划分为7x7份,每个网格对应2个位置信息(x,y,w,h,confidence)+20个类别信息
YOLOv2相比YOLOv1有较大的改进:
YOLOv3相比于YOLOv2改进:
YOLOv4比YOLOv3提升:
YOLOv5相比YOLOv4提升:
yolox:
deeplabv1为解决pooling 下采样时造成的信息丢失和空间不变性问题提出空洞卷积和全连接条件随机场(CRF,deeplabv3不使用),也提出了MSc,前五层使用,参数量较大,提升不大,不建议使用
deeplabv2同样提出了v1的问题,并且增加了对多尺度目标问题的解决。通过减少下采样的使用和空洞卷积改善下采样问题,优化了CRF方法,提出ASPP网络解决多尺度问题。
deeplabv3替换了backbond,resnet主干特征提取网络,改进了ASPP结构(1个1x1,3个3x3,1个全局pooling),引入了Mulit-grid结构(重复了3次resnet最后一个网络的三次操作),也就是串行链接和并行链接两种结构,一般是使用了并行链接,去除了CRF后处理。
YOLOV1
学习链接
anchor-based典型代表是Faster Rcnn、YOLOV2、YOLOV3等,这种是基于先验的候选框尺寸进行预测目标位置,(候选框的基本尺寸通过kmeans聚类得到)。而anchor-free是未使用先验候选框参数,让候选框根据目标自动学习大小变换,典型的YOLOV1,CornerNet、DenseBox等。
学习链接
学习链接
数据增强可以分为,有监督的数据增强和无监督的数据增强方法。其中有监督的数据增强又可以分为单样本数据增强和多样本数据增强方法,无监督的数据增强分为生成新的数据和学习增强策略两个方向。
详细学习链接
将4张图像拼接起来!
详细学习链接
1 在所有的bboxes中随机挑选k个作为簇的中心。
2 计算每个bboxes离每个簇的距离1-IOU(bboxes, anchors)
3 计算每个bboxes距离最近的簇中心,并分配到离它最近的簇中
4 根据每个簇中的bboxes重新计算簇中心,这里默认使用的是计算中值,自己也可以改成其他方法
5 重复3到4直到每个簇中元素不在发生变化
梯度消失和梯度爆炸产生的主要原因有:一是使用了深层网络,二是采用了不合适的损失函数。
解决方案:
(1)pre-training + fine-tunning
(2)Relu、leaky Relu…
(3)BN
(4)残差网络
(5)LSTM的门结构
梯度爆炸附加:
(6)重新设计网络模型
(7)梯度阶段
(8)权重正则化
详细学习链接
总梯度被近距离主导,远距离梯度消失或者被忽略不计
多头保证了transformer可以注意到不同子空间的信息,捕捉到更加丰富的特征信息。可以考虑想卷积的通道数,获取不同的信息关注度。
使用Q/K/V不相同可以保证不同空间的投影,增强表达能力,提高了泛化能力。
为了计算更快。矩阵加法计算量简单,但是作为整体计算attention的时候,计算量量和点乘相似。
可以看到,数量级对softmax得到的分布影响非常大。在数量级较大时,softmax将几乎全部的概率分布都分配给了最大值对应的标签。
padding位置位置置为负无穷(一般来说-1000就可以),softmax计算时, e x e^x ex中x趋近于负无穷为0
相同点
不同点
transformer的优势就在于利用注意力的方式来捕获全局的上下文信息从而对目标建立起远距离的依赖,从而提取出更强有力的特征。
(1)CNN是通过不断地堆积卷积层来完成对图像从局部信息到全局信息的提取,不断堆积的卷积层慢慢地扩大了感受野直至覆盖整个图像;但是transformer并不假定从局部信息开始,而且一开始就可以拿到全局信息,学习难度更大一些,但transformer学习长依赖的能力更强,另外从ViT的分析来看,前面的layers的“感受野”(论文里是mean attention distance)虽然迥异但总体较小,后面的layers的“感受野“越来越大,这说明ViT也是学习到了和CNN相同的范式。没有“受限”的transformer一旦完成好学习,势必会发挥自己这种优势。
(2)CNN对图像问题有天然的inductive bias,如平移不变性等等,以及CNN的仿生学特性,这让CNN在图像问题上更容易;相比之下,transformer没有这个优势,那么学习的难度很大,往往需要更大的数据集(ViT)或者更强的数据增强(DeiT)来达到较好的训练效果。
好在transformer的迁移效果更好,大的数据集上的pretrain模型可以很好地迁移到小数据集上。还有一个就是ViT所说的,transformer的scaling能力很强,那么进一步提升参数量或许会带来更好的效果(就像惊艳的GPT模型)。
详细学习链接
样本太多,无法得出分布的参数值,可以采样小样本后,利用极大似然估计获取假设中分布的参数值。
极大似然估计,通俗理解来说,就是利用已知的样本结果信息,反推最具有可能(最大概率)导致这些样本结果出现的模型参数值!
https://zhuanlan.zhihu.com/p/26614750
在回归任务中等价于MSE损失
在分类任务中等价于交叉熵损失