CV DP相关 ---- 卷积计算、1x1 卷积、BN、梯度爆炸与消失、ResNet残差、RoI Pooling 和 RoI Align

  • 卷积输出计算以及卷积核参数计算

       计算量C_{input} \times C_{output} \times I \times J \times H_{output} \times W_{output},,即输入通道数、输出通道数、卷积核长、宽、输出特征图的长、宽的乘积;

       参数数量C_{input} \times C_{output} \times I \times J

       当1*1卷积出现时,在大多数情况下它作用是升/降特征的维度,这里的维度指的是通道数(厚度),而不改变图片的宽和高。

       e.g. W*H*6的特征,现在需要用1*1的卷积核将其降维成W*H*5,即6个通道变成5个通道,通过一次卷积操作,W*H*6将变为W*H*1,这样的话,使用5个1*1的卷积核,显然可以卷积出5个W*H*1,再做通道的串接操作,就实现了W*H*5。
在这里先计算一下参数数量,一遍后面说明,5个卷积核,每个卷积核的尺寸是1*1*6,也就是一种有30个参数。

  • BN 的原理、存在的问题及解决、流程、计算、好处、inference过程描述
    • 原理:
      • Internal Covariate Shift:在训练过程中,隐层的输入分布总是在变化;
      • 图像白化:对输入数据分布变换到0均值,单位方差的正态分布,网络收敛变快;
      • BN的基本原理就是对于每个隐层神经元,把逐渐向激活函数极限饱和区靠近的输入分布强制拉回到均值为0方差为1比较标准的正态分布,使得输入值落入激活函数梯度较大较为敏感的区域,以此避免梯度消失问题;
    • 问题及解决:
      • Q: 如果都通过BN,就跟把非线性函数替换成线性函数效果相同,网络的表达能力会下降;
      • A: 为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),这两个参数是通过训练学习到的 —— 既可以应用非线性的较强表达能力,又避免太靠非线性区两头使得网络收敛速度太慢;
    • 流程:

              

    • 好处:
      • 避免了梯度消失问题,收敛快,训练所需的时间变短;
      • 可以选择比较大的初始学习率,进一步提升训练速度;
      • 可以减少dropout、L2正则项的使用(BN具有提高网络泛化能力的特性);
      • 不需要使用局部响应归一化(Alexnet中使用到)
    • inference过程:
      • 计算公式 :  ,两个参数均为定值,无需重复计算;
      • 保存每个mini-batch的均值和方差,依此可以求出全局的均值和方差;
      • inference的输入只有一个实例,所以用全局的均值和方差代替训练时mini-batch中的均值和方差;
    1. 输入一个mini-Batch;
    2. 计算mini-batch的均值;
    3. 计算mini-batch的方差;
    4. 对每一个输入进行标准化(减去均值除以标准差,\epsilon 用于防止除数为0);
    5. 小幅度缩放和移动(scale / shift);
  • 梯度消失和梯度爆炸的解释、成因、判断、解决办法
    • 原理:BP过程中,\Delta w = -\alpha \frac{\partial Loss}{\partial w},根据链式求导法则,梯度可以表示为激活函数导数和权重连乘(\sigma '(z)\,w)的表达式,随着网络层数加深,梯度的连乘表达式的项数增加,如果这些项都小于1,就会出现梯度消失;反之如果这些项(权重 w 较大时)都大于1就会出现指数爆炸从而导致梯度爆炸;
    • 原因:
      • 梯度消失一般出现在深层网络或采用了不合适的损失函数(\sigma '(z) 太小,比如sigmoid;
      • 梯度爆炸一般出现在深层网络权值初始化值太大(w 太大的情况下;
    • 判断:
      • 模型无法从训练数据中获得更新(如低损失);

      • 模型不稳定,导致更新过程中的损失出现显著变化;

      • 训练过程中,模型损失变成 NaN;

    • 解决方法:

      • 梯度消失:
        • ReLU、Leaky-ReLU(ReLU将负值设为0,造成节点死亡) 等激活函数替代 sigmoid;

        • Batch Normalization(将每一个隐含层的输入分布强制拉回到均值为0方差为1比较标准的正态分布,落在激活函数梯度比较合适的部分

        • LSTM 结构改善 RNN中梯度消失; 

        • 残差结构:短路机制可以无损传播梯度,另一部分不是直接传过来的(通过多层weights和ReLU)

      • 梯度爆炸:

        • ReLU、Leaky-ReLU(ReLU将负值设为0,造成节点死亡) 等激活函数替代其他激活函数;

        • 梯度截断(Gradient Clipping):设置一个梯度剪切阈值,更新梯度时,如果梯度超过这个阈值,就将其强制限制在这个范围之内;

        • 权重正则化(weithts regularization):l1 正则(权重绝对值)和 l2 正则(权重平方),检查网络权重的大小,通过正则化项惩罚过大的权值;

  • ResNet 如何解决梯度消失,写出公式

       

       ResNet中有很多跨层连接结构 \frac{\partial loss}{\partial x_1} = \frac{\partial loss}{\partial x_L}\cdot \frac{\partial x_L}{\partial x_l} = \frac{\partial loss}{\partial x_L}\cdot (1+\frac{\partial}{\partial x_L} \sum^{L-1}_{i=1} F(x_i, W_i)),小括号中的1表明短路机制可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失,所以残差学习会相对容易。

  • RCNN、Fast-RCNN、Faster-RCNN、Mask-RCNN系列的区别

       参见:RCNN 系列比较Mask-RCNN总结

  • ROI Pooling 和 ROI Align 的区别
    •  参见:Mask-RCNN总结
    • ROI Pooling:从输入图上的RoI映射到特征图上的RoI 特征图,直接通过四舍五入取整得到的结果;将RoI feature 转化为固定大小的bin时,又采用了取整操作(maxpooling);
      • 存在的问题:两次取整量化造成的feature map 和 RoI 区域不匹配(mis-alignment)问题;
    •  ROI Align:ROI映射到feature map后,将候选区域分割为k*k个单元,每个单元固定四个坐标的位置(grid points),用双线性插值的方法计算这四个点的位置,然后做max pooling操作;
      • 主要改进:
        • 不再做取整操作,使用双线性插值(在两个方向分别进行一次线性插值)来更精确找到每个块对应的特征;

猜你喜欢

转载自blog.csdn.net/francislucien2017/article/details/86759871