Residuals,residual的用法

  Residuals,residual的用法

  前言深度剩余网络——深度学习变得更深深度剩余网络——使深度学习变得超级深。

  ResNet(残差神经网络)是由原微软研究院的何等四位中国人提出的。通过使用残差块成功训练出一个152层的神经网络,在ILSVRC 2015中获得冠军,top-5错误率为3.57%,而参数数量低于VGGNet,效果非常突出。ResNet的结构可以非常快速地加速超深度神经网络的训练,模型的精度也有了很大的提高。2015年,MSRA深度残差网络在ImageNet识别、ImageNet检测、ImageNet定位、Coco检测、COCO分割五个领域获得第一名。

  这些年来网络竞赛的影响

  网络革命

  是不是网络越深模型效果越好?

  深度带来的问题随着网络结构的深入,带来了两个问题:

  一个是消失/爆炸梯度,这使得训练很难收敛。这类问题可以通过规范化初始化和中间规范化层来解决。另一种是退化现象,叫做退化。如果合适深度模型的层数继续增加,模型的精度会下降(不是过拟合造成的),训练误差和测试误差会很大。在CIFAR-10和ImageNet中都出现了相应的现象。

  可以看到残留的结构。普通直连卷积神经网络和ResNet最大的区别在于,ResNet有很多旁路分支,直接把输入连接到后一层,让后一层直接学习残差。这种结构也称为快捷连接。传统的卷积层或全连接层传输信息时,或多或少存在信息丢失、丢失等问题。Res. NET在一定程度上解决了这个问题,通过直接将输入信息传输到输出来保护信息的完整性。整个网络只需要学习输入和输出的区别,简化了学习目标和难度。同时,34层住宅网取消了FC的最后几层,通过avg pool直接连接1000路输出通道的Softmax,使得ResNet的计算量低于16-19层的VGG。注:实现部分为深度不变的连接,虚线部分为深度变化的连接。对于不同深度的连接,有两种解决方案:

  使用零填充无参数提升深度。利用1*1卷积核提高卷积核维数的运算时间。两种方法中,以下一种更有效,但运行时间会更长,一般首选第一种,以节省运行成本。

  残差作者提出深度残差学习框架,解决深度增加导致的性能下降问题。

  假设一个神经网络的输入为X,期望输出为H(x),即H(x)是期望的复势映射,但很难学习;如果我们将输入X直接传递给输出作为初始结果,通过下图中的“快捷连接”,那么此时我们需要学习的目标就是F(x)=H(x)-x,所以ResNet相当于改变了学习目标,而不是学习一个完整的输出,它是最优解H(x)与全等映射X的差,即残差F(x)=H(x)。

  Shortcut原意是捷径,这里指的是跨级连接。在公路网中设置一条从X到Y的路径,以T(x,Wt)作为闸门来把握它们之间的权重。ResNet快捷方式没有权重。通过X后,每个模块只学习剩余的F(x),网络稳定,容易学习。作者还证明了随着网络深度的增加,性能会逐渐变好。可以推测,当网络层数足够深时,优化残差函数:f (x)=H(x) x很容易优化一个复杂的非线性映射H(x)。

  瓶颈结构在ResNet的论文中,除了两层剩余学习单元之外,还有两层剩余学习单元和三层剩余学习单元。两层的残差学习单元包含两个相同输出通道的33个卷积(因为残差等于目标输出减去输入,即输入输出维数需要一致);另一方面,3层残差网络在Network In Network和incidence net中使用11卷积,中间33的卷积前后使用11卷积,先降维后增维,降低了计算复杂度。另外,如果输入和输出维度不同,我们可以在X上做一个线性映射变换,然后连接到下面的层。TIP:网络深度大于50层时使用bottleneck,可以有效降低参数

  为什么残更好?

  Deeplearning.ai第4部分(卷积神经网络)第2周内容

  众所周知,网络的性能与深度密切相关。如果在一个浅层网络A上叠加几层形成网络B,如果这些新增的层是身份映射,那么网络B的性能至少不会比A差。但实际实验结果表明,网络越深,性能越差,所以笔者猜测solver很难学习到单元映射。既然学习单元映射比较麻烦,那就简单的给它加个快捷方式,直接把输入叠加在这个模块的输出上。其实单位映射x不是最优解H(x),最优解在单位映射附近。这个最优解和单位映射的差叫做残差F(x)。

  附录批量标准化实现方法

  批量规格化和白塔会在每个楼层使用,通过学习不断更新。是一批的平均值,是标准差(一般会加上10-8的小值,以防为0)(2)测试阶段

  模型训练后,参数是固定的,所以对于每个输入测试样本,用于归一化的均值E和方差Var应该是固定的。因此,训练阶段的批均值的均值和方差的无偏估计用于计算:

  重构:(3)注意事项

  加入BN层后不再需要神经元原有的偏向。BN的作用之一是可以使激活函数的范围更广,所以在激活函数之前进行操作。

  Python实现了残差块def residual _ block (x,out _ channels,down _ sample,projection=False):in _ channels=x . get _ shape()。as _ list()[3]if down _ sample:x=max _ pool(x)output=conv2d _ with _ batch _ norm(x,[3,3,in_channels,out_channels],1)output=conv2d _ with _ batch _ norm(output,[3,3,out_channels,out_channels],1) if in_channels!=out _ channels:if projection:# projection shortcut input _=conv2d(x,[1,1,in_channels,out_channels],2)else:# zero-pad input _=tf . pad(x,[[0,0],[0,0],[0,out _ channels-in _ channels]])else:input _=x return output _ def residual _ group(name,x,num_block,out _ channels):assert num_block=1, num _ block必须大于1 带TF。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: