通俗易懂DenseNet
写在前面
在博客《ResNet详解与分析》中,我们谈到ResNet不同层之间的信息流通隐含在“和”中,所以从信息流通的角度看并不彻底,相比ResNet,DenseNet最大的不同之处在于,并不对feature map求element-wise addition,而是通过concatenation将feature map拼接在一起,所以DenseNet中的卷积层知道前面每一步卷积发生了什么。
Crucially, in contrast to ResNets, we never combine features summation before they are passed into a layer; instead, we combine features by concatenating them.
同ResNet结构类似,DenseNet也是由多个Dense Block串联而成,如下图所示
Dense Block与Transition Layer
在每个Dense Block内部,每个卷积层可以知道前面所有卷积层输出的feature map是什么,因为它的输入为前面所有卷积层输出的feature map拼接而成,换个角度说,每个卷积层得到的feature map要输出给它后面所有的卷积层。这里说“每个卷积层”并不准确,更准确的说法应该是“每组卷积”,后面将看到,一组卷积是由1个\(1\times 1\)卷积层和 1个\(3\times 3\)卷积层堆叠而成,即bottleneck结构。
to ensure maximum information flow between layers in the network, we connect all layers (with matching feature-map sizes) directly with each other. To preserve the feed-forward nature, each layer obtains additional inputs from all preceding layers and passes on its own feature-maps to all subsequent layers.
下面看一个Dense Block的示例,
图中的\(x\)为feature map,特别地,\(x_0\)为网络输入,\(H\)为一组卷积,同Identity Mappings in Deep Residual Networks采用了pre activation方式,即BN-ReLU-\(1\times 1\)Conv-BN-ReLU-\(3\times 3\)Conv的bottleneck结构。\(x_i\)为\(H_i\)输出的feature map,\(H_i\)的输入为concatenation of \([x_0, x_1, \dots, x_{i-1}]\)。定义每个\(H\)输出的 channel数为growth rate \(k =4\),则\(H_i\)的输入feature map有 \(k_0 + k\times (i-1)\)个channel,特别地,\(k_0\)为\(x_0\)的channel数。所以,对于越靠后的\(H\),其输入feature map的channel越多,为了控制计算复杂度,将bottleneck中\(1\times 1\)卷积的输出channel数固定为\(4k\)。对于DenseNet的所有 Dense Block,growth rate均相同。
相邻Dense Block 之间通过Transition Layer衔接,Transition Layer由1个\(1\times 1\)卷积和\(2\times 2\)的average pooling构成,前者将输入feature map的channel数压缩一半,后者将feature map的长宽尺寸缩小一半。
可见,bottleneck和Transition Layer的作用都是为了提高计算效率以及压缩参数量。
DenseNet网络架构与性能
DenseNet用于ImageNet的网络架构如下,通过上面的介绍,这里的架构不难理解。
DenseNet的Parameter Efficiency很高,可以用少得多的参数和计算复杂度,取得与ResNet相当的性能,如下图所示。
理解DenseNet
DenseNet最终的输出为前面各层输出的拼接,在反向传播时,这种连接方式可以将最终损失直接回传到前面的各个隐藏层,相当于某种Implicit Deep Supervision,强迫各个隐藏层学习到更有区分里的特征。
DenseNet对feature map的使用方式可以看成是某种多尺度特征融合,文中称之为feature reuse,也可以看成是某种“延迟决定”,综合前面各环节得到的信息再决定当前层的行为。文中可视化了同block内每层对前面层的依赖程度,
For each convolutional layer ‘ within a block, we compute the average (absolute) weight assigned to connections with layers. Figure 5 shows a heat-map for all three dense blocks. The average absolute
weight serves as a surrogate for the dependency of a convolutional layer on its preceding layers.
图中可见每个Dense Block中每层对前面层的依赖程度,约接近红色表示依赖程度越高,可以看到,
- Dense Block内,每个层对其前面的feature map利用方式(依赖程度)是不一样的,相当于某种“注意力”
- Transition Layer 以及最后的Classification Layer对其前面相对宏观的特征依赖较高,这种趋势越深越明显
Plain Net、ResNet与DenseNet
这里做一个可能并不恰当的比喻,对比一下Plain Net、ResNet 与 DenseNet。
如果将网络的行为比喻成作画,已知最终希望画成的样子,但要经过N个人之手,每个人绘画能力有限,前面一个人画完交给后面的人。
Plain Net:前面一个人画完,后面一个人只能参照前一个人画的自己重新绘制一张,尽管他能力有限,但他必须得画。
ResNet:前面一个人画完,后面一个人在其基础上作画,他更多地关注当前画与最终画的差异部分,同时他还有不画的权利。
DenseNet:当前作画的人可以看到前面所有人的画,同时他还知道大家绘画的顺序以及谁的画工相对更好更可靠,他参照前面所有的画自己重新绘制一张,然后连同前面所有的画一同交给后面的人。
不难看出,ResNet和DenseNet的侧重点不太一样,但大概率应该都比Plain Net画的更好。
所以,要是综合ResNet和DenseNet的能力是不是会画得更好呢?
以上。
参考
- paper: Densely Connected Convolutional Networks
- code: pytorch-densenet.py
- Densely Connected Networks (DenseNet)
通俗易懂DenseNet的更多相关文章
- Deep Learning 33:读论文“Densely Connected Convolutional Networks”-------DenseNet 简单理解
一.读前说明 1.论文"Densely Connected Convolutional Networks"是现在为止效果最好的CNN架构,比Resnet还好,有必要学习一下它为什么 ...
- 【转】能否用讲个故事的方式,由浅入深,通俗易懂地解释一下什么是天使投资,VC,PE.
能否用讲个故事的方式,由浅入深,通俗易懂地解释一下什么是天使投资,VC,PE 今天在知乎上看到一篇文章,觉得值得一转的,Here. 我给楼主讲个完整点的故事吧.长文慎点,前方高能,自备避雷针.18岁以 ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- 关于一个通俗易懂的FFT的C语言实现教程
找到一个通俗易懂并且神奇并且有趣的FFT算法C语言实现教程:http://www.katjaas.nl/FFTimplement/FFTimplement.html 只要对矩阵比较熟悉就能在教程的辅助 ...
- 【原创】通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
这篇blog重点在解决问题,如果你对字符编码并不是特别了解,建议先看看 < [原创]通俗易懂地解决中文乱码问题(1) --- 跨平台乱码 >. 当然,如果只是针对解决这个Mysql插入报错 ...
- 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...
原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...
- canvas绘制自定义的曲线,以椭圆为例,通俗易懂,童叟无欺
本篇文章,将讲述如何通过自定义的曲线函数,使用canvas的方式进行曲线的绘制. 为了通俗易懂,将以大家熟悉的椭圆曲线为例,进行椭圆的绘制.至于其他比较复杂的曲线,用户只需通过数学方式建立起曲线函数, ...
- web安全普及:通俗易懂,如何让网站变得更安全?以实例来讲述网站入侵原理及防护。
本篇以我自己的网站[http://www.1996v.com]为例来通俗易懂的讲述如何防止网站被入侵,如何让网站更安全. 要想足够安全,首先得知道其中的道理. 本文例子通俗易懂,从"破解网站 ...
- 如何才能通俗易懂的解释javascript里面的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
随机推荐
- java.lang.SecurityException: java.lang.IllegalStateException: java.io.FileNotFoundException:XXXXXX(系统找不到指定文件)
项目启动成功过,但访问页面抛出异常. 在Maven项目启动的时候,tomcat缓存机制没有吧maven jar除外的jar执行到项目里面,所有不要慌,项目重新启动就OK了, 如果这样还是不行的话就找到 ...
- c++ string 的注意事项
string 的reserve 和 resize 区别 reserve 与capacity相关,如果reserve一个比当前capacity大的 reserve 只会找到一块合适大小的内存,并将原始内 ...
- [CTS2019]珍珠(NTT+生成函数+组合计数+容斥)
这题72分做法挺显然的(也是我VP的分): 对于n,D<=5000的数据,可以记录f[i][j]表示到第i次随机有j个数字未匹配的方案,直接O(nD)的DP转移即可. 对于D<=300的数 ...
- swank: (too proud or confident) 炫耀;卖弄 to behave in way that is too proud or confident
from : https://www.bing.com/dict/search?q=swank&qs=n&form=Z9LH5&sp=-1&pq=swank&s ...
- 二十六、linux邮件服务器
1.安装: yum install -y sendmail 因为是最小安装,需要包没有安装 yum install -y mailx 2.日志:/var/log/maillog 3.启动:/etc ...
- 2019-2020-1 20199324《Linux内核原理与分析》第四周作业
第三章 MenuOs的构造 一.知识点总结 计算机的三大法宝: 存储程序计算机 函数调用堆栈 中断 操作系统的两把宝剑: 中断上下文的切换(保存现场和恢复现场) 进程上下文的切换 它们都和汇编语言有着 ...
- 绿洲作业第一周 - Y3每日中文学习任务清单
尽量每天完成一首古诗. 如果孩子另有学习安排,可在周日(2.16)23:59前,完成任务.有兴趣.学有余力的孩子可以自我拓展其中的“寒假读诗”.
- [LC] 61. Rotate List
Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...
- 67)PHP,cookie的基本使用和基本原理
(1)允许 服务器端脚本 , 在浏览器端 存数数据的一种技术. 其实cookie是浏览器的一种技术. (2)特点:允许服务器向浏览器发送指令,用来管理存储在浏览器端的cookie数据. ...
- 四剑客(sed)
一. sed sed简介: 用Linux环境中的编辑器程序来编辑文本文件.这些编辑器可以让你用简单命令或鼠标单击来轻松地处理文本文件中的文本.但有时候,你会发现需要自动处理文本文件,可你又不想动用全副 ...