本系列专栏第一篇《CVPR 2017论文解读:用于单目图像车辆3D检测的多任务网络》本系列专栏第二篇《CVPR 2017论文解读:特征金字塔网络FPN》日前,CVPR2017获奖论文揭晓,一篇其中***论文是?由康奈尔大学、清华大学、FacebookFAIR实验室共同撰写。本文由Momenta高级研发工程师胡杰解读。本文是本系列专栏的第三篇。近年来,随着卷积神经网络(CNNs)的快速发展,学术界涌现出一大批非常高效的模型,如GoogleNet、VGGNet、ResNet等,涌现于各种计算机视觉任务中。但随着网络层数的加深,网络在训练时的前向信号和梯度信号可能会在经过很多层后逐渐消失。关于这个问题,以前有一些非常好的工作。例如在Highway和ResNet结构中提出了数据旁路(skip-layer)技术,让信号在输入层和输出层之间高速流动。核心思想是创建一个跨层连接来连接网络。道路中间的前后楼层。在本文中,作者基于这一核心思想设计了一种新的连接方式。为了最大化网络中所有层之间的信息流,作者将网络中的所有层成对连接起来,使得网络中的每一层都接受其前面所有层的特征作为输入。由于网络中存在大量的密集连接,作者将这种网络结构称为DenseNet。其结构图如下左图所示:它主要有以下两个特点:1)在一定程度上缓解了训练过程中梯度耗散的问题。因为我们从上图左图中可以看出,每一层在反向传播时都会接收到所有后续层的梯度信号,所以随着网络深度的增加,靠近输入层的梯度会越来越小。2)由于大量的特征被复用,使用少量的卷积核就可以生成大量的特征,最终模型的尺寸相对较小。构成DenseNet的单元模块如右图所示。看起来和ResNet的unitmodule很像,但其实差别很大。我总结了结构设计的细节如下:1)为了进行特征复用,在跨层连接时,使用了特征维度上的Concatenate操作,而不是Element-wiseAddition操作。2)由于不需要Elewise-wise操作,所以不需要在每个单元模块底部进行1X1卷积来upscale特征层数与输入特征维度一致。3)采用Pre-activation策略设计单元,将BN操作从主分支移至分支前。(BN->ReLU->1x1Conv->BN->ReLU->3x3Conv)4)由于网络中的每一层都接受前面所有层的特征作为输入,为了避免网络层数的增加,将后一层的特征维度增长太快。在每个阶段之后进行下采样时,首先通过一个卷积层将特征维度压缩到当前输入的一半,然后进行Pooling操作。如下图所示:5)增长率的设置。增长率是指每个单元模块的3x3卷积核的数量,记为k。由于每个单元模块以Concatenate的形式连接,每经过一个单元模块,下一层的特征维度就会增加k。它的值越大,意味着网络中流通的信息量越大,相应的网络能力也就越强,但整个模型的规模和计算量也会增加。作者在本文中使用了k=32和k=48两种设置。基于以上原理,作者为ImageNet设计了四种DesNet-121(k=32)、DesNet-169(k=32)、DesNet-201(k=32)和DesNet-161(k=48)物体识别任务。网络结构。其网络的组织形式与ResNet类似,同样分为4个stage。更换了原来的ResNet单元模块,下采样过程略有不同。整体结构设计如下:在ImageNet上的实验结果如下:左上图为参数量与错误率的关系,右上图为模型测试的计算量与错误率的关系错误率。不难看出,在达到相同精度的情况下,DenseNet的参数量和计算量大约是ResNet的一半。总的来说,这是一部非常具有创新性的作品。提出了共享特征和任意层间互连的概念,极大地缓解了深度网络在训练过程中梯度耗散和优化困难的问题。同时,它也减少了模型的大小和计算量,在标准数据集上获得了非常好的性能。唯一可能的缺点是网络不能设计的特别“深”,因为随着DenseNet网络层数的增加,模型的特征维度会线性增加,这样训练时的计算量和内存开销进程也会爆发式增长。Q&A:1.DenseNet可以用于目标检测任务吗?效果如何?A:当然,DenseNet可以像ResNet一样应用于物体检测任务。不过作者并没有在物体检测任务上进行实验。如果关注DenseNet在物体检测任务上的效果,可以参考第三方在物体检测任务上使用DenseNet的实验结果。2.从图中可以看出,在计算量相对较小、模型尺寸相对较小的情况下,DenseNet相对于同尺寸ResNet的准确率提升会更加明显。是不是说DenseNet结构更适合小模型的设计呢?A:确实,DenseNet在小模型的情况下有更大的优势。同时,作者也对比了最近发表的专为移动端和小模型设计的MobileNet,结果表明DenseNet(~400MFlops)可以用更小的计算量实现比MobileNet(~500MFlops)更高的效果.ImageNet分类准确率。3.DenseNet中非常关键的连续跨层Concatenate操作只存在于每个DenseBlock内部,不同DenseBlock之间没有这种操作。有什么考虑?A:其实每个DenseBlock***的featuremap已经将当前block所有卷积模块的输出拼接在一起,降采样后送到下一个DenseBlock,已经包含了这个DenseBlock的所有信息.这也是一种取舍。4.像DenseNet这样的模型结构在训练过程中有什么技巧吗?A:训练过程使用与ResNet文章相同的设置。但是还是有一些技巧的。例如,因为有多个Concatenate操作,相同的数据在网络中会有多个副本。这里需要用到一些内存优化的技巧,使得训练时的内存使用量可以随着层数的增加而线性增加,而不是增加。快点,相关代码会在近期公布。【本文为栏目组织《机器之心》原创文章,微信公众号《机器之心(id:almosthuman2014)》】点此查看作者更多好文
