文章目录

  • Batch
  • 梯度下降算法容易陷入局部最小值,那为什么大家还用呢
  • iteration 以及 epoch:
  • max_evals
  • ROI Pooling
  • ROI Align
    • 双线性差值计算
  • 正则化:
  • BN层
  • 小概念
    • 上采样
    • Depthwise Convilution深度卷积
    • 可变形卷积 (deformable convolution)
    • Channel shuffle
  • ResNet网络理解
    • building Block块、bottleneck块
  • SSD网络
  • RetinaNet
  • Cascade R-CNN
  • Transformer

Batch

什么需要有 Batch_Size 这个参数?
Batch 的选择,首先决定的是下降的方向。如果数据集比较小,完全可以采用全数据集 ( Full Batch Learning )的形式

另一个极端:就是每次只训练一个样本,即 Batch_Size = 1。这就是在线学习(Online Learning)。使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

批梯度下降法(Mini-batches Learning)

在合理范围内,增大 Batch_Size 有何好处?
• 内存利用率提高了,大矩阵乘法的并行化效率提高。
• 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。减少训练时间
• 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

盲目增大 Batch_Size 有何坏处?
• 内存利用率提高了,但是内存容量可能撑不住了。
• 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
• 会导致模型泛化能力有所下降(但是时间足够长则可以抵消)
• Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

因而选一个折中数字
GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128…时往往要比设置为整10、整100的倍数时表现更优

梯度下降算法容易陷入局部最小值,那为什么大家还用呢

0.1 只用一阶导数是难以区分最优点和鞍点的。 若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点啦。
1 很多时候训练在具有小梯度的点处停止。梯度的范数不为零,因此从技术上讲,它不会收敛到临界点。
2 对于深度网络的损失函数,好的极小值的吸引池体积优于差的极小值,这保证了随机初始化的优化方法收敛到好的极小值。
3 SGD收敛性的很多结论都是经验性的。默认使用的mini-batch梯度下降法本身就是有噪声的梯度估计,哪怕我们位于梯度为0的点,也经常在某个mini-batch下的估计把它估计偏了
4 随机梯度下降(SGD)和它的变种(比如Momentun、Adam)才是训练神经网络最流行的方法。

iteration 以及 epoch:

1个iteration就等于使用batch_size个样本进行训练一次。
epoch则表示训练集中的全部样本训练一次。
比如,1000个训练样本,batch_size=10,则1 epoch中有100个iteration。

max_evals

max_evals:表示要评估多少个检查点。在培训期间,试用作业将定期保存检查点(例如,如果停止培训,您不会丢失以前的所有工作;或者,您可以在通过n和m迭代分别创建的网络之间进行选择)。您通常会同时启动一个评估作业,该作业将定期评估最后创建的检查点,直至max_evals个检查点。如果您不填写此值,它将评估所有创建的检查点,从而在培训期间定期为您提供评估性能

ROI Pooling

regions of interest(ROI)层能实现training和testing的显著加速,并提高检测accuracy
2个输入:
a固定大小的feature maps; 通常叫share_conv
b一个表示所有ROI的N x 5的矩阵(N是ROI的数目)rois , RPN的输出,一堆矩形候选框,单个形状为 1x5x1x1 其中4个坐标+索引index,坐标参考系针对的是原图(CNN的输入)
输出:将不同大小的box矩形框,映射为固定大小w x h的矩形框

  1. Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800800,最后一层特征图feature map大小:2525
  2. 假定原图中有一region proposal,大小为665x665,这样,映射到特征图中的大小:665/32=20.78,即20.78x20.78,如果你看过Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20*20
  3. 假定pooled_w=7,pooled_h=7,即pooling后固定成7x7大小的特征图,所以,将上面在 feature map上映射的20x20的 region proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86*2.86,此时,进行第二次量化,故小区域大小变成2x2
  4. 每个2x2里取最大值,得到7x7的feature map

优点:
6. 用于对象检测任务
7. 它使我们能够重用卷积网络中的特征图
8. 它可以大大加快培训和测试时间
9. 它允许以端到端的方式训练物体检测系统
缺点:
由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。
存在两次量化过程:
10. 将候选框边界量化为整数点坐标值。
11. 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。
改进: ROI Align (以浮点型操作,用插值方法)

ROI Align

ROI时,预测ROI的坐标为(6.4, 12.8, 153.6, 172.8),特征图大小为8×8,先要量化为(1,1,4,5),再ROI Pooling时由于无法整除,再次量化。
在8x8上pool到3x3时, 采用双线性差值计算

双线性差值计算

双线性差值无非就是用两次线性差值而已,线性差值很好理解,就是等比平均。
下图x1,x2为普通像素点,x,y是差值之后得到的,就是按距离(小数)作为权重取了两个点的均值

双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

正则化:

指的是修改学习算法,使其降低泛化误差,而非训练误差。
正则化一个学习函数,给代价函数添加被称为“正则化项regularizer”的惩罚因子。

L2L^2L2参数正则化,使得权重更加接近原点。又叫岭回归,Tikhonov正则
能感知到有较高方差的输入x,
因此与输出目标协方差较小(相对增加方差)的特征的权重会收缩


Eaug=Ein+λ2w2E_{aug}=E_{in}+\frac{\lambda}{2}w^2 Eaug​=Ein​+2λ​w2
L1L^1L1正则化 :
L=Ein+λ∑j∣wj∣L=E_{in}+\lambda\sum_j|w_j| L=Ein​+λj∑​∣wj​∣
L2不会产生很多0,虽然限制了w的大小但是都还有值

  1. 相比L2正则化,L1正则化会得到更稀疏的解
    (最优值中一些参数为0),广泛用于特征选择(有可解释性)


分别为L2正则和L1正则

BN层

减均值,除以方差。(每个通道单独进行,边角特征意义不同)
BN算法的强大之处在下面几个方面:

  1. 可以选择较大的学习率,使得训练速度增长很快,具有快速收敛性。
  2. 可以不去理会Dropout,L2正则项参数的选择,如果选择使用BN,甚至可以去掉这两项。
  3. 去掉局部响应归一化层(LRN)。(AlexNet中使用的方法,BN层出来之后这个就不再用了)
  4. 可以把训练数据打乱,防止每批训练的时候,某一个样本被经常挑选到。


网络一旦训练起来,参数就要发生更新,出了输入层的数据外,其它层的数据分布是一直发生变化的,因为在训练的时候,网络参数的变化就会导致后面输入数据的分布变化,比如第二层输入,是由输入数据和第一层参数得到的,而第一层的参数随着训练一直变化,势必会引起第二层输入分布的改变,把这种改变称之为:Internal Covariate Shift

BN放置的位置
根据文献说,BN可以应用于一个神经网络的任何神经元上。
按照原文第一章的理论,应当在每一层的激活函数之后(例如ReLU=max(Wx+b,0)之后),对数据进行归一化。
文献主要是把BN变换,置于网络激活函数层的前面。原文中BN在ReLU之前 防止大数字进入sigmoid的饱和区域
因此最后把BN层+激活函数层就变成了:

z=g(BN(Wu))

测试时BN使用
训练阶段的均值u、标准差σ来作为测试样本所需要的均值、标准差

for i in range(channel):x = input[:,:,:,i]mean = mean(x)variance = variance(x)x = (x - mean) / sqrt(variance)x = scale * x + offsetinput[:,:,:,i] = x

且各层BN的均值,方差参数要保存下来.
网络上很多说训练Is_traing=True,验证时为False.

var_list = tf.trainable_variables()
g_list = tf.global_variables()
bn_moving_vars = [g for g in g_list if 'moving_mean' in g.name]
bn_moving_vars += [g for g in g_list if 'moving_variance' in g.name]
var_list += bn_moving_vars
saver = tf.train.Saver(var_list=var_list, max_to_keep=5)

BN一般不用全量均值方差。
每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。

也正是因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。

需要注意,在正向传播时,会使用γ与β使得BN层输出与输入一样。
在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。
BN层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个特征图,每个特征图的大小是100100,这样就相当于这一层网络有6100100个神经元,如果采用BN,就会有6100100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。
卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵(m,f,w,h),m为min-batch sizes,f为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m
w*h,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。

BN 讲的比较好:
https://www.cnblogs.com/CJT-blog/p/10424058.html

小概念

上采样

  1. 插值,双线性插值,因为效果最好
  2. 反卷积,对feature map 间隔填充0,再进行标准卷积
  3. max unpooling, 对称的max pooling位置记录最大索引,然后在unpooling阶段时将对应的值放置到原先最大值位置,其余位置补0;

Depthwise Convilution深度卷积

标准卷积是C个卷积核,每个卷积核3,3,64(第三个维度是输入channel数),每个卷积核输出一层,一共输出C层,再垒起来输出
深度可分离卷积,每个卷积核都是单通道的1,1,k,k
即第i个卷积核与featuremap的第i个通道进行二维的卷积运算。输出维度1,c,h,w,不能改变map的通道数
所以后面往往再跟一个哦C,iC,1,1的标准卷积来改变通道数

总的计算量为k×k×iC×oH×oW+iC×1×1×oH×oW×oC,是普通卷积的1/oC+1/(k×k),大大减少了计算量和参数量,又可以达到相同的效果,这种结构被称为深度可分离卷积(Depthwise Separable Convolution),在MobileNet V1被提出,后来渐渐成为轻量化结构设计的标配。

可变形卷积 (deformable convolution)

空洞卷积等,补0的地方都是固定的
可变性卷积是指卷积核上对每一个元素额外增加了一个h和w方向上偏移的参数,然后根据这个偏移在feature map上动态取点来进行卷积计算,这样卷积核就能在训练过程中扩展到很大的范围。
如下图,貌似要花2k方的计算先算下卷积核参数,再卷积

Channel shuffle

ShuffleNet中首次提出,主要是针对分组卷积中不同组之间信息不流通,对不同组的feature map进行混洗的一个操作

ResNet网络理解

building Block块、bottleneck块


图右为 bottleneck

H(x)=F(x)+x,x是输入,F(x)是卷积分支的输出,H(x)是整个结构的输出。可以证明如果F(x)分支中所有参数都是0,H(x)就是个恒等映射。残差结构人为制造了恒等映射,就能让整个结构朝着恒等映射的方向去收敛,确保最终的错误率不会因为深度的变大而越来越差。

图5左右有相似的时间复杂度。图5对应conv2输出特征图为56x56
左边乘法次数: 3x3x64x56x56x64 x 2
右边:1x1x256 x 56x56x64 + 3x3x64x56x56x64 + 1x1x64x56x56x256
化简 8 x (64x56x56x64) 差别在9和8系数之间

BN层可以解决梯度消失,梯度爆炸,
过于深时准确率会饱和,然后下降。

SSD网络

RetinaNet

Cascade R-CNN

Transformer

深度学习中一些时而会忘的概念相关推荐

  1. 深度学习中 epoch,[batch size], iterations概念解释

    one epoch:所有的训练样本完成一次Forword运算以及一次BP运算 batch size:一次Forword运算以及BP运算中所需要的训练样本数目,其实深度学习每一次参数的更新所需要损失函数 ...

  2. 深度学习中的线性代数知识详解

    1. 基础概念 标量(scalar) 一个标量就是一个单独的数,一般用小写的的变量名称表示. 向量(vector) 一个向量就是一列数,这些数是有序排列的: ⎡⎣⎢⎢⎢⎢x1x2...x5⎤⎦⎥⎥⎥⎥ ...

  3. 深度学习中的Normalization模型(附实例公式)

    来源:运筹OR帷幄 本文约14000字,建议阅读20分钟. 本文以非常宏大和透彻的视角分析了深度学习中的多种Normalization模型,从一个新的数学视角分析了BN算法为什么有效. [ 导读 ]不 ...

  4. 深度学习中的Normalization模型

    /*本文可以随便转载,转载时请注明作者及文章出处*/ 作者:新浪微博  张俊林 Batch Normalization(简称BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种 ...

  5. 深度学习中GPU的作用

    英伟达推出的"霸王条款":GeForce产品禁止用于深度学习. 英伟达的禁令 众所周知,英伟达是显卡界的老大,2017年英伟达的GPU芯片在全球市场的占有率为70%左右,无论是人工 ...

  6. 《深度学习中的字符识别在工业视觉中的实际应用》

    最近在公司做了一个构建卷积神经网络来识别字符的项目,编程环境为pycharm2019,使用的是OpenCv+Pytorch进行项目的实现,因此想总结和归纳一下方法. 本次的字符识别项目可以分为以下几个 ...

  7. 深度学习中的一些英文解释

    A: (1)anchors:锚点.(anchors(锚点)定义在RPN网络中) B: (1)bounding box:预测边界框. (2)Botton-up 3D proposal generatio ...

  8. 深度学习中的优化算法之MBGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

  9. 深度学习中的优化算法之BGD

    之前在https://blog.csdn.net/fengbingchun/article/details/75351323 介绍过梯度下降,常见的梯度下降有三种形式:BGD.SGD.MBGD,它们的 ...

最新文章

  1. 2021 AAAI Fellow名单重磅出炉,华人学者遗憾连续两年无缘入选 | AI日报
  2. CCF大数据专家委:2018年大数据发展趋势预测
  3. 利用多线程实现报表的高效导出
  4. 人的大脑皮层对产品设计有何启发?
  5. pytorch基础知识整理(二)数据加载
  6. 4行代码AC——L1-038 新世界 (5分)
  7. 如何使用SAP CRM Marketing Survey创建一个市场问卷调查
  8. TensorFlow2 实现神经风格迁移,DIY数字油画定制照片
  9. OpenCV图像处理基础操作(2)
  10. 在计算机上格式u盘启动,U盘制作dos启动盘几种简单方法
  11. 2022最新手机号码正则
  12. 软件开发:关于园林绿化工中级理论知识题题库的软件内容
  13. 魔趣9上手体验(坚果pro2)
  14. Win10如何修改外接显示器分辨率
  15. vue mand-mobile ui加class不起作用的问题 css权重问题
  16. 理解virt、res、shr之间的关系(linux系统篇)
  17. 矩阵与行列式的区别 行列式简单理解(二三阶)
  18. mysql数据库复合索引
  19. C# 枚举高级用法之Description
  20. cmd命令行下怎么切换目录 命令行改变目录

热门文章

  1. aac转化为mp3,详细的转换步骤
  2. Python:urllib解析查询参数parse_qsl、parse_qs
  3. (转帖)互联网协会与IDGVC发布Web2.0 100
  4. GPRS模块为什么会低至十几元?我所经历的物联网模块国产化过程
  5. HTML期末大作业~玄幻情缘游戏官网静态html模板
  6. (附源码)node.js游云旅游网站 毕业设计231547
  7. 大数据项目一般金额多少_大数据工作月薪多少 就业前景好不好?
  8. 似然函数取对数的原因
  9. ERROR:Xst:899--FPGA ERROR
  10. java springmvc权限校验_springmvc拦截器实现用户登录权限验证