1、直方图均衡化
2、对比度拉伸,或者调节
3、若受光源影响,使得图片整体色彩往一方面移动,用白平衡算法进行修正,使其发黄、发蓝、发红的照片更加趋于自然光下的图像
4、若是过爆或者过暗,可是设计阈值函数,不用全局阈值,对特定区域进行特定阈值分割。
5、若是太暗,可以采用对数变化,对数图像增强是图像增强的一种常见方法,其公式为:S = c log (r+1),对数使亮度比较低的像素转换成亮度比较高的,而亮度较高的像素则几乎没有变化,这样就使图片整体变亮。
6、采用拉普拉斯算子增强 , filter2D (src,dst)
7 . 实际中自己采用的是多采集数据,不进行任何处理,让模型去处理过亮过暗的情况,只有在模型处理不了 的情况下,再进行类似于上面的辅助处理操作.
这在 VGGNet 的原始论文中得到了很好的解释。原因有二:首先,您可以使用几个较小的核而不是几个较大的核来获得相同的感受野并捕获更多的空间上下文,但是使用较小的内核时,您使用的参数和计算量较少。其次,因为使用更小的核,您将使用更多的滤波器,您将能够使用更多的激活函数,从而使您的 CNN 学习到更具区分性的映射函数。
1 . 隐藏层太多
2 . 激活函数不合适
1 . 激活函数不合适
2 .权重 参数初始化太大
3 . 个人实际遇到的: (1)输入数据未进行归一化处理 (2) 标签打的有问题
1 . 采用预训练模型
3、用 ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout 等替代 sigmoid 函数。
4、使用 batchnorm
5、使用残差结构
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。
1 . dropout / BN / Early Stop
2 . 减少模型参数/层数
3 . 数据增强
将一个 batch 的数据变换到均值为 0、方差为 1 的正态分布上,从而使数据分布一致,每层的梯度不会随着网络结构的加深发生太大变化,从而避免发生梯度消失并且加快收敛,同时还有防止过拟合的效果;
添加链接描述
添加链接描述
见此网站
见此网址
模型加速通常是指模型训练完成后,对模型推理速度的提高。
常用思路有:
l 网络剪枝系列思路
l 模型量化系列思路
(1).模型backbone
(2).整体的识别思路,如同rcnn 到 yolo的思路改变
优点:
每次迭代计算量小,对硬件算力要求低
训练更大的数据集
1、先整体后局部:第一步先检测到人,得到人身体区域。第二步,在身体区域内检测骨 骼关键点。
2、先局部后整体:第一步对图像上所有得骨骼关键点进行检测。第二部,将属于一个身 体得骨骼关键点合并。
添加链接描述
添加链接描述
1.反卷积又叫做转置卷积,在计算机中计算的时候,转置卷积先将卷积核转为稀疏矩阵C的形式,然后计算的时候正向传播的时候左乘这个稀疏矩阵C的转置,反向传播的时候左乘这个稀疏矩阵C。
一般的卷积运算可以看成是一个其中非零元素为权重的稀疏矩阵C与输入的图像进行矩阵相乘,反向传播时的运算实质为C的转置与loss对输出y的导数矩阵的矩阵相乘
反卷积的运算过程与卷积正好相反,是正向传播时左乘C的转置,反向传播时左乘C
2、反卷积的用途
实现上采样;近似重构输入图像,卷积层可视化
Batch Normalization就是在batch纬度上做正交归一化,GN就是在channel维度上对每个group做正交归一化。
添加链接描述
(1)从模型结构上来说分为:模型剪枝,模型蒸馏,NAS自动学习模型结构等。
(2)模型参数量化上包括数值精度量化到FP16等。
注:模型剪枝的例子很多出现在轻量化网络上面,比如mobilenet v3里面出现的group conv,更改网络末端计算量大的层。深度分离卷积等。
模型蒸馏就是迁移学习。
参数量也在mobilenet v3里面有体现,减少网络头部的卷积核的数量。
交并比。
IOU GIOU DIOU CIOU详解1
IOU GIOU DIOU CIOU详解2
提示:内存/显存占用;模型收敛速度等
Hessian矩阵是n*n, 在高维情况下这个矩阵非常大,计算和存储都是问题。
mini-batch太小会导致收敛变慢,太大内存利用率提高了,但是内存容量可能撑不住了,精度降低。泛化性不好。
dropout的原理就是在网络前向传播的时候,让神经元的激活值以一定的概率变为零,这样可以使模型的泛化性能更强。
前向:训练时,利用伯努利分布,随机选出一个只包含0,1的mask矩阵,然后用这个mask矩阵去对应乘上每个输入得到的就是Dropout后的结果,再除以(1-p);测试的时候不用Dropout
反向:训练时根据mask来求对应的梯度,测试时无Dropout
dropout为什么可以防止过拟合呢?
1、dropout其实相当于我们日常用到的基于平均的ensemble,ensemble有两种方式,基于平均的ensemble和投票的ensemble。对于网络中的部分神经元进行概率暂时舍弃,这样相当于训练了多个网络。
2、dropout还取消了神经元之间的共适应关系,使得网络的输出不依赖于网络中的某些隐含节点的固定作用,使模型的鲁棒性更好。
3、类似于生物进化的角色,环境的变化不会对物种造成毁灭性的影响。
def dropout(x,p):
if p<0 or p>1:
raise Exception('The p must be in interval [0,1]')
retrain_prob = 1-p
sample = np.random.binomial(n=1,p=retrain_prob,size=x.shape)
x *=sample
x /=retrain_prob
return x
1、小目标对应的anchor(4-6)比较少,其对应的feature map上的pixel难以得到训练,这也是为什么SSD在augmentation之后精确度上涨(因为crop之后小目标就变为大目标)
2、要检测小目标需要足够大的feature map来提供精确特征,同时也需要足够的语义信息来与背景作区分
1、pooling操作虽然能增大感受野,但是会丢失一些信息。空洞卷积在卷积核中插入权重为0的值,因此每次卷积中会skip掉一些像素点;
2、空洞卷积增大了卷积输出每个点的感受野,并且不像pooling会丢失信息,在图像需要全局信息或者需要较长sequence依赖的语音序列问题上有着较广泛的应用。
添加链接描述
主要分为离线增强和在线增强的方法。
离线增强是指数据集在本地进行处理。
在线增强:翻转(水平,垂直),旋转,缩放,裁剪,平移,添加噪声等。
1、网格搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。
2、贝叶斯优化:贝叶斯优化其实就是在函数方程不知的情况下根据已有的采样点预估函数最大值的一个算法。该算法假设函数符合高斯过程(GP)。
添加链接描述
卷积的作用:相当于滤波器,提取图片不同的特征,生成feature_map
激活函数的作用:引入非线性因素
池化的作用:1、减少特征维度大小,使特征更加可控,减少参数个数,从而控制过拟合程度,增加网络对略微变换后的图像的鲁棒性;2、达到一种不变性,包括translation,rotation,scale等。3、会造成梯度稀疏,丢失信息,GAN网络中通常使用带步长的卷积,进行下采样来替代pooling。
全连接的作用:对提取到的特征进行分类和回归。
通过控制卷积核个数实现升维或者降维,从而减少模型参数
对不同特征进行归一化操作(BN),增加非线性(relu)
用于不同channel上特征的融合
激活函数分为两类,饱和激活函数和不饱和激活函数。
饱和激活函数的代表是sigmoid,tanh。特点是:收敛慢,容易梯度消失。
非饱和激活函数的特点是:收敛快,抑制梯度消失,抑制过拟合。
sigmoid:计算量大。梯度消失,会改变原始数据分布。
tanh:计算量大,梯度消失比sigmoid好点
relu:计算简单,有效防止了梯度消失和梯度爆炸,会出现神经元死亡。
leakrelu:解决了神经元死亡的问题,但是多了一个参数a
ELU:避免dying神经元,并且处处连续,从而加速SGD,但是计算比较复杂
并不能说明这个模型无效,导致模型不收敛的原因可能有数据分类的标注不准确;样本的信息量太大导致模型不足以fit整个样本空间;
学习率设置的太大容易产生震荡,太小会导致不收敛;可能复杂的分类任务用了简单的模型;数据没有进行归一化的操作。
Python可以用opencv,pillow和SKimage库来读取图片并处理。
pytorch可以用unsequeeze(0),tensorflow可以用expand dim来增加维度。
信号前向传播,误差反向传播,通过不断调节网络的权重,使得网络的最终输出与期望输出尽可能接近。前项过程中通过与正确的标签计算损失,反向传递损失,更新参数,优化至最后的参数。
1、牛顿法的目标函数是二阶导数,在高维的情况下这个矩阵非常大,计算和储存都是问题。
2、在小批量的情况下,牛顿法对噪声的估计太大。
3、在目标函数非凸的情况下,牛顿法易受到鞍点和极大值点的吸引。
finetune就是通过修改预训练网络模型结构(如修改模型类别输出个数等)选择性的载入预训练网络模型的权重(载入除最后的全连接层之前的所有层)再用自己的数据集重新训练模型。
finetune的实践建议:
预训练模型的限制,不能随意修改模型的网络架构,但是可以输入任意的图片。
学习率:与重新训练相比,finetune需要使用更小的学习率。
对输入图像用多个不同尺寸的卷积核,池化操作进行同时处理,然后将输出结果进行通道拼接。
核函数将数据映射到更高维的空间后处理,但是不用这种显式的映射,而是现将两个向量做内积,然后再用核函数做映射。这样做等价于先做映射,再做内积,而且避免了高维空间复杂的内积运算。
mobileNet虽然在计算量上减少了很多,但是由于深度可分离卷积的操作,使得网络的层数增加了很多,而我们的GPU计算是并行数据处理,假设GPU内存足够大的话所以GPU计算的速度核心是网络的层数。
loss的问题:
1、训练过程中loss为负数:
【原因】输入的训练数据没有归一化造成
【解决方法】把输入数值通过下面的函数过滤一遍,进行归一化
inputdata = (inputdata-inputdata.min())/(inputdata.max()-inputdata.min())
2、怎么看loss和acc的变化
train loss 不断下降,test loss不断下降,说明网络仍在学习;
train loss 不断下降,test loss趋于不变,说明网络过拟合;
train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目;
train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。
3、初始学习率设置的问题:
可以从0.0001到0.1每次扩大10倍试验,直到验证集上的loss增大。
一般0.01-0.1左右
mmdetection上面有自己的学习率设置方式,一般为0.125batch_sizegpus。
4、样本不平衡问题。(具体的我会另外再开一篇博文)
样本不平衡呈现长尾分布,解决方案:
a、上采样增强
b、下采样增强
c、训练动态加权采样
d、稀少数据专家模型
满足非线性,几乎处处可导,单调的函数可以用作激活函数
过拟合就是训练集上表现好但是验证集上表现不好。
欠拟合就是训练集上loss不降低,学习能力弱。
产生原因:
过拟合产生的原因:模型太复杂,样本噪声多,决策树容易过拟合,iou阈值过高,训练集迭代次数太多。
欠拟合:模型复杂度低。数据不纯净。
解决方案:
过拟合:
1、正则化,l1,l2
2、dropout
3、早停,earlystoping
4、数据增广
欠拟合:
1、增加模型复杂度
2、数据预处理
同步训练存在木桶效应,需要各个设备的计算能力要均衡,而且要求集群的通信也要均衡。
异步模式理论上存在缺陷,容易发生梯度失效问题,但因为mini-batch随机梯度下降本身就是梯度下降的一个近似解法,且即使是梯度下降也无法保证全局最优。
在实际应用中,在相同时间内使用异步模式训练的模型不一定比同步模式差。所以这两种训练模式在实践中都有非常广泛的应用。
首先loss出现nan,由于loss函数的使用不正确。
loss震荡,检查数据是否归一化,调整学习率,查看是否有梯度回传,使用大的模型。
可以采用多个二分类组合的方式。例如:1对1,1对多,多对多等。
偏差描述的是网络的真实输出和期望输出之间的差距,方差描述的是训练模型中各个预测结果之间的差异。所以:高方差,说明拟合程度好,但是过拟合风险较高;高偏差,说明拟合程度差,欠拟合,有很大的误差。
当模型较为复杂的时候。偏差变小,方差变大。(模型复杂容易导致过拟合)
1、增大batch_size同时增大学习率,若初始学习率为0.1,则学习率变化为
0.1*batch_szie/256
2、lr warm up
3、residual的BN中γ初始化为0
4、no bias decay
5、降低精度 float16
6、cos退火 学习率
7、label smoothing
8、知识蒸馏
9、mix_up cutout 随机裁剪,数据增强等
添加链接描述
1、DataLoader()加载数据
2、初始化权重和bais
3、optim 优化方式,学习率学习方式
4、损失函数 torch.nn.
5、Conv,pool,relu,dropout,FC等
6、反向传播 loss.backword
7、保存模型 torch.save 加载模型 torch.load
与交叉熵的区别:
交叉熵就是简单地分类one_hot,ctcloss的话会包含序列的信息,提升分类准确率。
CTCLOSS解决的问题就是:输入与输出的label不需要完全对齐,CTC允许我们的神经网络在任意一个时间段预测label,只有一个要求—输出序列的顺序是正确的就好。
CTCLoss中两个重复字符中间的blank不会消除这两个重复字符:
ab_bc ------abbc
首先sigmoid是一个非线性的激活函数,神经网络的非线性是通过非线性的激活函数和多层网络的融合叠加实现的。
1、手肘法:计算每个聚类的均方误差和,画出曲线图,拐点处即为。
2、计算每个聚类的 gap = 类内距离/类间距离
3、随机采样进行聚类。
4. 个人办法:
(1)遍历所有的框,把长宽花在坐标图上,得到如下的图,找到点集中的几个
(2)测试多个不同个数的聚类,然后计算误差
添加链接描述
增加数据集,数据增广,降低iou阈值,模型融合。
添加链接描述
奇数, 可以定位锚点,偶数没有锚点
实际工作用遇到腐蚀膨胀,中设置的卷积核,当时设置的是偶数, 膨胀后,风向杆发生了偏移, 所以奇数可以使特征不发生偏移
添加链接描述
添加链接描述
用处:本质是搜索局部极大值,抑制非极大值元素。
原理:NMS为非极大值抑制,用来抑制检测时冗余的框。
大致算法流程为:1.对所有预测框的置信度降序排序2.选出置信度最高的预测框,确认其为正确预测,并计算他与其他预测框的IOU 3.根据2中计算的IOU去除重叠度高的,IOU>threshold阈值就删除 4.剩下的预测框返回第1步,直到没有剩下的为止
(需要注意的是:Non-Maximum Suppression一次处理一个类别,如果有N个类别,Non-Maximum Suppression就需要执行N次。)
假设两个目标靠的很近,则会识别成一个bbox,会有什么问题,怎么解决?
当两个目标靠的非常近时,置信度低的会被置信度高的框抑制掉,从而两个目标靠的非常近时会被识别成一个bbox。为了解决这个问题,可以使用softNMS(基本思想:用稍低一点的分数来代替原有的分数,而不是直接置零)
添加链接描述
添加链接描述
添加链接描述