关于resnet的论文(二)

https://www.bilibili.com/video/BV1vb4y1k7BV?p=4https://www.bilibili.com/video/BV1vb4y1k7BV?p=4https://www.bilibili.com/video/BV1vb4y1k7BV?p=4上一篇文章有两个关键词:恒等变换,差分放大器

留下了一个疑问:resnet对深度网络进行了短路链接,等价于将网络变浅,那么为何不直接将网络变浅

可以看到目标检测算法精度的发展史,yolo在之后也加入了resnet

又提到了VGG,googlenet,inceptionnet

background:自从alexnet可以将卷积网络做到又宽又深之后,之后的算法很多都以alexnet提出的新思想去发展相关领域的算法。那么既然是深度网络,那么到底能够做到多深呢??基于alexnet提出的方法,网络能够在多深正常运行呢???在加深网络的过程中就出现了这种网络退化现象

 这里做了一个对比,大概的意思是,右边的途中画框的部分就是要添加resnet 构件的地方,框住的层的输入是作为基底的浅层网络的输出,这个输入要保留,同时计算框住的层的输出,比较两个结果,看哪一个更好

 在普通网络结构中,我们是希望用x通过两层结构来拟合h(x)

 而在残差网络中,网络要拟合的就不再是h(x),而是f(x)。这种短路连接被称之为identity,恒等映射

残差就是这个f(x)???f(x)还可以被看作是偏移量offset???

我现在的判断是:根据之前loss function那种平方和误差的结构,f(x)之所以是残差,是因为

f(x) = h(x) - x

要保证f(x),x能够运算,他们必须同型,很显然x经过网络处理之后,很可能降维了或者是通道数增加了,所以得有措施解决这个问题。很多是使用1*1卷积来做尺寸的调整

之前我的疑问就是为什么不直接做浅层网络,答案就是加了resnet的深层网络效果更好

 最深的resnet-152相比VGG参数量更少,训练速度更快

 coco数据集上的mAP普遍要更低啊。这个数据集类别更多,共有80个类别

这篇论文的姊妹篇《identity mapping》,甚至做了1000层网络。同时关于resnet为什么可以训练这么快,论文给出了他的解释:梯度信息可以从深层灌回浅层。有点难以理解??

论文摘要开篇就做了论断

resnet重构了用于提取卷积特征的backbone,之前的backbone是用于拟合一个分布,重构后的网络就去拟合上一层输出的残差,也就是那个f(x) 

 较之于VGG-19,resnet更深但是复杂度更低,之后应该算一下为什么运算量反而变小了,这个变化是均匀的还是存在分布的???

resnet只在backbone上增加了一定数量的残差模块,增加了网络深度,在coco数据集上取得了48.5%的mAP.5,相比于其他,取得了28%的性能提升,之前大概是37.9%

 ZFnet将底层中层高层的特征在论文中都做了可视化,底层特征一般都是边缘、形状、斑块、颜色这样的特征,中层特征一般就会出现纹理信息,高层特征就是更为特化的纹理信息,可能就会出现具体的某些部位

通过加深网络,提取到的特征的层次逐步从像素级别向语义级别跨越

 这里就反映了当时的倾向,要将卷积网络做得更深,像yolo1将VGG采用为backbone,也不过是darknet9

 

在2013年的RCNN的论文中,也是反复提到了迁移训练这件事,先进行预训练,再进行fine tunning.明确表示,可以将用于识别任务的特征迁移到目标检测任务上。

文章用2016之前的模型来论证卷积网络做深的重要性,紧接着提问

是否可以直接增加网络深度呢??

如果可以的话,当年lenet的后继者为什么在长达20年的时间里都无法将卷积网络的深度加上去呢??

首先的问题就是梯度弥散以及梯度爆炸问题

这个问题已经可以通过各种权重初始化技巧解决了。需要解决两个方向上的问题,一个是特征在前向传播过程中的衰减,一个是反向传播过程的衰减。权重初始化方案需要选择,针对不同的激活函数,需要增加归一化机制,在训练过程中进行调节。比如像sigmoid这样的饱和激活函数,隔一段时间就需要进行归一化将神经元的输入拉回到梯度敏感的区域。

 紧接着就是深层卷积网络的核心问题:网络退化-degradation

 这里的具体做法我还是判断不清楚,并且我并不太认可之前说的加if分支的想法

子豪兄在这里有个判断,认为这是一个递归的结构,如果递归的话,那上图中的两个浅模型就必须是相同的了??

加的结构,一层是恒等映射,一层是复制的浅层结构,但实际上这个位置时可以使用新的结构的吧??只是说要选用浅一点的结构 

 问题来了,这种递归结构没有办法做SGD的优化,这一点没懂???

这种结构之下,反向传播要怎么进行?

此时还是没有明白这种拟合方向上的变化会带来怎样的效果

我现在的判断是:假设x是一个7*7*30的张量,f(x)实际上是一个以x为输入的网络输出的结果,设f(x)也是一个7*7*30的张量,h(x) = x + f(x),这个h(x)作为下一层网络的输入。如果说loss function沿用原来的那种,并不会有直接的效果将f(x)朝着0的方向进行收敛

我靠,这是基于一种假设。有点当年爱因斯坦推断狭义相对论的时候,假设光速不变那种感觉

 作者认为,基于上面那种假设,残差模块包含的子结构的权重,也就是相应的filter的值应该全为0

这个判断有点烧脑

 如果残差模块的输入足够好,意味着loss已经收敛得差不多了。即基于当前得模型,已经能达到最好得效果,不需要再改变,则相应地用于修正输出得项就应该为0.在公式中,残差模块得权重为1

shortcut connection, skip connection, identity mapping

 子豪兄在这里说,会增加一些加法运算,再结合前面提到的将残差模块的权重朝0收敛这一点,基本可以断定残差模块是没有if分支的,就是增加了这个加法运算

 论文在Imagenet数据集上做了性能测试,实验证明:

 同时,由resnet提取的卷积特征相较于plain net(没有res模块)提取的特征要更优秀,可以将其直接迁移到其他网络之中

这个现象表示resnet可以解决网络退化问题,可以提取更好的卷积特征,是不受数据集的影响

cifar-10数据集的样本分辨率只有32*32,属于小尺度样本,收敛很快

这里提到residual function,我还有点懵,其实就是f(x),因为残差模块的输入是x,x要经过网络处理,这个过程可以整合成一个函数f(x),所以我们平时讲的残差,实际的表示应该是残差函数f(x)

deep residual learning

what is residual learning??

 underlying mapping底层映射

这里有两个概念感觉也比较混乱,到底网络的什么位置是底层,什么位置是深层。之前说resnet模块可以将梯度相当好地传递到底层,如果h(x)是底层,那么网络的输出层是不是可以算作最底层?

 这里给了个万能近似理论,就是说如果网络可以拟合底层的h(x),那么他就可以拟合残差函数f(x)

这里的这段论述没明白:resnet不是去近似h(x),而是去近似f(x)。how to do it??在我的理解力,要想约束模型收敛的方向,必须得对loss function做一些设计才可以,loss function根本没有动,反向传播也只是作用到卷积网络的filter的数值上

这里讲你和残差会更加简单???原因在于神经网络要去拟合identity mapping是很难的,这相当于要求网络实现静默,什么都不做,这不符合神经网络的本质。就是说神经网络很难做到输出和输入几乎一致,我们从alexnet开始像神经网络加入了大量运算,比如说leaky relu, 光是这个激活函数就已经导致不可逆的信息损失。这里始终比较懵

identity mapping by shortcut:通过短路连接实现恒等映射

building block 积木

比如说残差模块中包含有两个卷积,那么除最后一层卷积之外,其他层都要进行激活

这里的W1不是全连接层那种运算吧,应该是卷积操作

 卷积运算就是一个element wise opration

单一变量的对照试验,即消融实验

如果残差模块只包含一个卷积层,从结构上来讲,他就等价于一层神经网络,有点像线性分类器,这样就没有优势。而且只有一层的话,f(x)是不能做激活的,在这个残差模块就没有加入非线性因素了

network architecture

 对于无残差的plain network,其backbone是VGGnet

 网络的设计原则。这个block表示块,程序里边可以用花括号来分离代码块,我估计这个一个块是不是表示二阶卷积层,这样的卷积层里边还有子结构,可能会做多次卷积,常见的做法是类似于bottleneck那样的结构,3*3卷积和1*1卷积交替使用

 所谓的下采样,亚采样,说白了就是对feature map进行降维,除了说stride为2的下采样,还可以使用1*1卷积来降低通道数。因此,我收了,必须去补足相应的关于feature map感受野尺寸的计算

 最后使用全局平均池化来代替全连接层。虽然2013年的RCNN做了很多实验证明fc是可以帮助网络学到特化的特征,但是之后已经找到相当多的等价结构来代替它,比如说上面的全局平均池化,或者是直接使用全卷积网络

就是说yolo1的时候,用于多尺度融合的解决方案就已经被使用了

在yolo2中,为了实现多尺度融合训练,即使我们的分类网络可以接纳不同尺度的输入,也使用了全局平均池化,只要保证多尺度输入的feature map的channel数量一致

这是加了残差模块的网络结构,残差模块的添加是不以block为界限的,每两个卷积层加一个shortcut connection, 实线表示输入和残差进行element wise adding, 虚线表示输入和残差尺寸不匹配,需要对输入x进行处理

虚线的部分都是因为包含了trans-block的部分,那么根据计算公式,残差的通道数肯定是要大于输入x的,所以其中一个措施就是为输入x补充channel,然后全部补0

第二个方法是1*1,stride = 2的卷积,这种卷积方式有很多作用:

(1)replace FC

(2)降维

(3)升维

(4)减少参数量

(5)bottleneck

 这是alexnet采用的一种方法,将一张图片裁成10张,送进网络然后取综合分数

fully-convolutional form:多尺度裁剪与结果融合,将图像缩放到不同尺度送进网络进行训练

这不就是多尺度融合训练吗??就是说yolo1发表的2016年就已经有人在分类任务上使用了,也许在更早之前,多尺度融合训练就已经出现。得等到2018年,yolo2才开始使用。在进行分类训练的时候,需要配合全局平均池化

 

实验结果

resnet在Imagenet分类数据集上进行了分类训练

 

 

 12.8万张训练集,5万张验证集,10万张测试集

在对plain net19和34的实验中发现了网络退化现象

论文首先分析,这应该不是梯度弥散造成的,BN层保证了前向传播的信息至少存在非0方差

 反向传播的梯度也是正常的

 所以既不是forward也不是backward的signal vanish

论文有一个推断,深度网络loss的收敛速度呈现指数级下降

突然想到:网络退化问题和过拟合是可以同时发生的

 

 

这居然还像是一个递归的结构,问题有上限,模型有上限

 

 使用的resnet101,全部使用bottleneck结构,先降后升,瓶颈结构

 B表示projection shortcut,投影短接,很抽象,之前根本没有听说过。

根据奥卡姆剃刀原理,如无必要,勿增实体

deeper bottleneck architecture

在inceptionnet中使用bottleneck结构,主要是利用等效卷积效应,减少模型总体的参数量

identity shortcut恒等映射短接很重要,他不会引入其他参数,我之前尝试引入一个固定参数来加强,但效果变得更差

如果把identity换成其他类型的shortcut,比如说projection,那么时间复杂度、模型规模全都会翻倍

为什么是翻倍???channel数还是因为一些固定的设计导致是两倍??

 shortcut两端连接的是高维?比如说这样一个结构:

 输入是一个56*56,可以看到shortcut两端的feature map的channel数都挺大

 resnet在cifar-10分类数据集上进行了分类训练

 cifar数据集的样本都是小分辨率样本,只有32*32

 

5万的训练集,1万的测试集

这里又介绍了一种实验的思路,在cifar数据集上进行深度网络结构的验证,专注于模型网络的深度,而非实现某种精细结构以求达到某种顶尖的精度

cifar这个数据集的分辨率其实特别小,小到按照一般网络的下采样倍数,最后输出的feature map只有1*1

这是在cifar数据集上使用的网络结构,首先是一个3*3卷积,然后堆叠6n的3*3卷积

 

  

 卷积步长全部为2,加上全局平均池化以适应多尺度输入,接上一个FC层,最后使用softmax

每两个3*3卷积使用一个残差部件 

 这样设计的残差网络和普通网络有相同的深度,宽度以及参数量

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值