开篇的这张图代表ILSVRC历年的Top-5错误率,我会按照以上经典网络出现的时间顺序对他们进行介绍,同时穿插一些其他的经典CNN网络。

前言

时间来到2016年,也就是ResNet被提出的下一年,清华的黄高(也是DenseNet的提出者)在EECV会议上提出了Stochastic Depth(随机深度网络)。这个网络主要是针对ResNet训练时做了一些优化,即随机丢掉一些层,优化了速度和性能(有点类似于Dropout的效果?)。论文原文见附录。

背景

ResNet这个里程碑式的创新对AI领域带来了深远的影响。然而,作者发现ResNet网络中不是所有的层都是必要的,因此结合经典的Dropout思想提出在训练过程中随机丢弃丢掉一些层来优化ResNet的训练过程。(PS:这不就是把Dropout用到网络层这个单位吗?)

结构

首先来看一下原始的ResNet结构,其中fff代表的是残差部分,ididid代表的是恒等映射,把这两部分求和经过激活然后然后输出。这个过程可以用下面的式子来表示:


如下图所示:


Stochastic Depth(随机深度网络)就是在训练时加入了一个随机变量bbb,其中bbb的概率分布是满足一个伯努利分布的,然后将fff乘以bbb,对残差部分做了随机丢弃。如果b=1b=1b=1,这个结构即是原始的ResNet结构,而当b=0b=0b=0时,残差支路没有被激活,整个结构退化为一个恒等函数。这个过程可以用下面的等式来表示:


上面提到bbb满足一个伯努利分布(01分布),它的取值只有000和111两种,其中取000的概率为1−p1-p1−p,取111的概率是ppp。上面的ppp又被称为生存概率,这个ppp即代表了b=1b=1b=1的可能性,因此ppp的设置相当重要。

  • 一种设置方式是将其设置为同一个值,即pl=pp_l=ppl​=p,其中plp_lpl​代表每个残差块lll的ppp参数取值。
  • 另外一种设置方式是将其设置为残差层数lll的平滑函数。从p0=1p_0=1p0​=1线性递减到pL=0.5p_L=0.5pL​=0.5,一共有L个残差块。公式表示如下:

论文选择了第二种设置方式,即将线性衰减规律应用于每一层的生存概率的设置,这是因为较早的层会提取低级特征,而这些低级特征会被后面的特征应用,因此前面的层不应该频繁的被丢弃,最终ppp产生的规则如Figure2所示。


论文中提到,将原始的ResNet模型调整为随机深度网络之后,期望深度为原始ResNet的34\frac{3}{4}43​,并且训练过程提速404040%,这个可以自己做实验验证。等等,34\frac{3}{4}43​怎么来的?看看下图就懂了。

测试

在测试过程中,所有的残差块都保持被激活的状态,以充分利用整个网络的所有参数。但每个残差块的权重都要根据其在训练中的生存概率ppp进行重新调整,具体来说,前向传播的公式如下:

实验

论文将ResNet的普通版和Stochastic_Depth版在CIFAR 10/100和SVHN做了实验。
首先作者和其他当时的SOTA网络在CIFAR10和CIFAR100上的错误率做了一个对比,如Table1所示:


训练过程中的测试错误率曲线随着Epoch数的变化情况如下:



下面的Table2展示了在相同数据集上训练ResNet的训练时间,随机深度网络比原始的ResNet有25%左右的训练速度提升。

为什么随机深度网络有效?

从实验结果可以看到,随机深度网络的精度比ResNet更高,证明了其具有更好的泛化能力,这是为什么呢?论文中的解释是,不激活一部分残差模块事实上提现了一种模型融合的思想(和dropout解释一致),由于训练时模型的深度随机,预测时模型的深度确定,实际是在测试时把不同深度的模型融合了起来。不过在查阅资料时我发现了另外一种解释,觉得也是有道理的,我贴一下截图。原始文章来自:https://zhuanlan.zhihu.com/p/31200098。

代码实现

随机深度网络中的将原始的残差模块替换为下面的带丢弃的单元即可,原始的可训练的代码见附录。


def residual_drop(x, input_shape, output_shape, strides=(1, 1)):global add_tablesnb_filter = output_shape[0]conv = Convolution2D(nb_filter, 3, 3, subsample=strides,border_mode="same", W_regularizer=l2(weight_decay))(x)conv = BatchNormalization(axis=1)(conv)conv = Activation("relu")(conv)conv = Convolution2D(nb_filter, 3, 3,border_mode="same", W_regularizer=l2(weight_decay))(conv)conv = BatchNormalization(axis=1)(conv)if strides[0] >= 2:x = AveragePooling2D(strides)(x)if (output_shape[0] - input_shape[0]) > 0:pad_shape = (1,output_shape[0] - input_shape[0],output_shape[1],output_shape[2])padding = K.zeros(pad_shape)padding = K.repeat_elements(padding, K.shape(x)[0], axis=0)x = Lambda(lambda y: K.concatenate([y, padding], axis=1),output_shape=output_shape)(x)_death_rate = K.variable(death_rate)scale = K.ones_like(conv) - _death_rateconv = Lambda(lambda c: K.in_test_phase(scale * c, c),output_shape=output_shape)(conv)out = merge([conv, x], mode="sum")out = Activation("relu")(out)gate = K.variable(1, dtype="uint8")add_tables += [{"death_rate": _death_rate, "gate": gate}]return Lambda(lambda tensors: K.switch(gate, tensors[0], tensors[1]),output_shape=output_shape)([out, x])

后记

随机深度网络就讲到这里了,我下线了。。

附录

  • 论文原文:https://arxiv.org/abs/1603.09382v1?utm_content=bufferbf6d7&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
  • Keras代码实现:https://github.com/dblN/stochastic_depth_keras

卷积神经网络学习路线往期文章

  • 卷积神经网络学习路线(一)| 卷积神经网络的组件以及卷积层是如何在图像中起作用的?

  • 卷积神经网络学习路线(二)| 卷积层有哪些参数及常用卷积核类型盘点?

  • 卷积神经网络学习路线(三)| 盘点不同类型的池化层、1*1卷积的作用和卷积核是否一定越大越好?

  • 卷积神经网络学习路线(四)| 如何减少卷积层计算量,使用宽卷积的好处及转置卷积中的棋盘效应?

  • 卷积神经网络学习路线(五)| 卷积神经网络参数设置,提高泛化能力?

  • 卷积神经网络学习路线(六)| 经典网络回顾之LeNet

  • 卷积神经网络学习路线(七)| 经典网络回顾之AlexNet

  • 卷积神经网络学习路线(八)| 经典网络回顾之ZFNet和VGGNet

  • 卷积神经网络学习路线(九)| 经典网络回顾之GoogLeNet系列

  • 卷积神经网络学习路线(十)| 里程碑式创新的ResNet


欢迎关注我的微信公众号GiantPandaCV,期待和你一起交流机器学习,深度学习,图像算法,优化技术,比赛及日常生活等。

卷积神经网络学习路线(十一)| Stochastic Depth(随机深度网络)相关推荐

  1. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2

    前言 这个系列已经更新了20多篇了,感谢一直以来大家的支持和等待.前面已经介绍过MobileNet V1,MobileNet V2,MobileNet V3,ShuffleNet V1这几个针对移动端 ...

  2. 卷积神经网络学习路线(十九) | 旷世科技 2017 ShuffleNetV1

    前言 这是卷积神经网络学习路线的第19篇文章,主要为大家介绍一下旷世科技在2017年发表的ShuffleNet V1,和MobileNet V1/V2一样,也是一个轻量级的卷积神经网络,专用于计算力受 ...

  3. 卷积神经网络学习路线(十七) | Google CVPR 2017 MobileNet V1

    前言 这是卷积神经网络的第十七篇文章,Google 2017年发表的MobileNet V1,其核心思想就是提出了深度可分离卷积来代替标准卷积,将标准卷积分成Depthwise+Pointwise两部 ...

  4. 卷积神经网络学习路线(五)| 卷积神经网络参数设置,提高泛化能力?

    前言 这是卷积神经网络学习路线的第五篇文章,主要为大家介绍一下卷积神经网络的参数设置,调参技巧以及被广泛应用在了哪些领域,希望可以帮助到大家. 卷积神经网络的参数设置 这个举个例子来说是最好的,因为直 ...

  5. 卷积神经网络学习指南_卷积神经网络的直观指南

    卷积神经网络学习指南 by Daphne Cornelisse 达芙妮·康妮莉丝(Daphne Cornelisse) 卷积神经网络的直观指南 (An intuitive guide to Convo ...

  6. 卷积神经网络学习心得

    卷积神经网络学习心得 文章目录 卷积神经网络学习心得 一.卷积神经网络 1.卷积 2.池化 3.激活函数 3.全连接层 3.训练过程 二.传播过程 1.卷积神经网络的前向传播过程 1.1卷积层的前向传 ...

  7. 2020-用多通道卷积神经网络学习单类特征用于人脸表现攻击检测

    2020年,Anjith George等人,期刊:TIFS,CCFA刊,Learning One Class Representations for Face Presentation Attack ...

  8. ​厦大等高校研究人员利用卷积神经网络学习脑电地形图表示进行分类

    脑电图(EEG)地形图表征(Electroencephalography topographical  representation, ETR)可以监测区域大脑活动,是一种可以用于探索皮层机制和联系的 ...

  9. ​利用卷积神经网络学习脑电地形图表示进行分类

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 脑电图(EEG)地形图表征(Electroencephalography topographical  represen ...

  10. 卷积神经网络学习二:tinny_cnn程序试运行

    卷积神经网络学习二:tinny_cnn程序试运行 一.下载tiny_cnn的资源,网址:https://github.com/tiny-dnn/tiny-dnn 二.解压文件 其中data文件夹中存放 ...

最新文章

  1. Python,OpenCV骨架化图像并显示(skeletonize)
  2. Transact_SQL语句大全
  3. Linux设置界面或命令行启动
  4. 线段树(成段更新,区间求和lazy操作 )
  5. 我用的 cordova 插件
  6. PyTorch机器学习从入门到实践-CH1
  7. yii框架源码分析之创建controller
  8. python求5_Python 5 运算符
  9. Java语言基础--集合
  10. hex文件分析+Qt5制作Hex文件转Bin文件的工具(含源码+工具下载)
  11. 软件测试测试工具总结
  12. 作为一个Java开发者,java常用算法手册pdf
  13. 2位字母组合的全球国家或地区缩写
  14. 基于BS模型与基于二叉树模型的欧式期权定价与希腊字母结果对比
  15. 线性回归中一次性实现所有自变量的单因素分析
  16. 校招基本告一段落,总结一下
  17. 【每日一句shell】grep匹配符合多个条件的行
  18. SASE (安全架构)
  19. 迅为4412开发板网络-最小局域网的配置方法
  20. 学习机器学习四 回归模型——线性回归、L1正则化(Lasso回归)、L2正则化(ridge回归)

热门文章

  1. 【css】boder-sizing 中content-box与boder-box的区别
  2. 惠斯特电桥平衡条件的证明
  3. 前端常用的八种数据结构
  4. 计算机二级access分数分布_计算机二级office题型及分值分布
  5. 【CSS】制作ICO图标
  6. *rock ,scissors ,paperpku 2339
  7. lvds输入悬空_MAX 10高速LVDS I/O用户指南
  8. 语音转文字,msg版,pyttsx3库
  9. unity3d 取锚点位置_如何不靠看格子,确定一个字的首笔和后面每一笔画的位置?...
  10. 创新电影院意在传播中华民族优秀传统文化