Resnet
- 前言
- 了解什么是过拟合问题
- Resnet介绍
1、前言
从各位学者无数次实验中都可以得出一个普遍的规律就是更深的网络有利于提供准确率,训练出来的模型的效果更加好,但这也衍生出一系类的问题,当我们的网络过于深后,我们的准确率会到达一定水平就会出现大幅度的下降,比更浅层的网络的准确率更低。同时由于网络的层数的加深,网络所需要的参数会更多,导致网络的训练的速度更加缓慢。
一般的来说,我们的网络由于深度过深导致的准确率急速下降的原因之一就是:出现了过拟合。
2、了解什么是过拟合问题
从上图我们可以得到两种结论:
1、当我们的数据的数据是完全百分百正确,没有一丝误差的时候,我们很显然希望我们训练出来的模型是绿色这条线,绿色的线他完全拟合于所有的数据,当我们属于进行测试的时候,能够准确输出正确的答案
2、但是保证数据集的完全正确几乎是一件完全不可能的事,并且测试集对于我们来说是未知的数据。此时,我们希望我们的训练出来的模型应该是黑色这条线,我们通常称绿色这条线为过拟合现象。即使黑色的线不能够完全拟合所有的数据,存在一定的误差。但是对于测试数据的不确定性,黑色的线则具有一定的兼容性,在测试数据集表现会远优于绿色模型。
3、Resnet 介绍
ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广性非常好,甚至可以直接用到InceptionNet网络中。
ResNet的主要思想是在网络中增加了直连通道,即Highway Network的思想。此前的网络结构是性能输入做一个非线性变换,而Highway Network则允许保留之前网络层的一定比例的输出。ResNet的思想和Highway Network的思想也非常类似,允许原始输入信息直接传到后面的层中,如下图所示。
这样的话这一层的神经网络可以不用学习整个的输出,而是学习上一个网络输出的残差,因此ResNet又叫做残差网络。
左图一般用于较浅的网络,右边的一般用于较深的网络
左图使用两个33的卷积,输出的通道数是64,
右图是一个11的卷积输出的是64维,33的卷积输出是64维,11的卷积输出是256维
第一个1x1的卷积把256维channel降到64维,然后在最后通过1x1卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的话就是两个3x3x256的卷积,参数数目: 3x3x256x256x2 = 1179648,差了16.94倍。
Resnet常见的网络结构图
可以看出在18层,34层这样的神经网络当中,通常采用的是两层的残差的神经网络。
但是在之后的50、101、152成的神经的网络当中,通常采用的是三层的残差网络,这样有达到降低参数的目的。
VGG 和 Resnet
论速度: VGG16层的神经网络在forward传播的速度是0.152s/batch
Resnet152层的神经网络在forward传播的速度是0。203/batch
实现Resnet网络(152层为例子)
代码块:
降采样: 使用最大池化层
def subsample(inputs, factor, scope=None): #这是一个降采样 输入 采样因子 对输入进行一个降采样
if factor == 1:
return inputs
else:
return slim.max_pool2d(inputs, [1, 1], stride=factor,padding='SAME', scope=scope) #最大池化采样
三层的残差网络
#1*1的卷积
residual = slim.conv2d(input,outputs, [1, 1], stride=1,scope='conv1')
#3*3的卷积网络
residual = conv2d_same(residual, outputs, 3, stride, scope='conv2')
#1*1的卷积网路
residual = slim.conv2d(residual, depth, [1, 1], stride=1,normalizer_fn=None, activation_fn=None,scope='conv3')
残差的结果+采样
output = shortcut + residual #shortcut采样的结果