深度残差网络论文(ResNet)
出现的问题:
在深度学习的认识中,模型的深度应该是越深越好。但传统的深度学习模型,随着模型深度的增加,不管是训练错误率还是测试错误率都比浅层模型要高。 传统模型(Plain Net),左边为训练错误率,右边为测试错误率提出的解决方法:
针对上述问题,作者提出了深度残差网络(ResNet)。即对应输入x,经过若干层卷积和激活后(注意最后一层的卷积后并没有直接跟激活函数,如下图relu是在相加之后的操作),得到的输出F,再加上原来的输入。最终输出为F+x。文中的层数为2,作者也尝试3层或其他层数,其中只有1层的话效果并不明显。
通过残差块进行残差学习
例如:对于2层的残差块,输入为x,经过第一层卷积后得到W1x,再经过一个Relu激活函数得到σ(W1x)。经过第二层卷积得到F = W2σ(W1x) 。此时与之前的输入x进行相加。得到最终的输出F+x。然后再进行Relu激活...
模型细节:
在上述F+x的操作过程中要注意F和x的维度要相同,否则相加操作会出错。这也是为什么在残差网络模型中残差块之间有用实线和虚线进行连接了。其中实线表示x和F维度相同,可以直接进行相加,而虚线表示x和F维度不相同,要对x进行“处理”后才能相加。
部分残差网络模型
(1)为什么会出现x和F维度相同和不相同两种情况?
举个栗子:规定数据表示为[channel,height,width]。输入一张32x32的彩色图片,即表示为[3,32,32]。先经过16个核大小(kernel_size)为3x3,步长(stride)为1,填充(padding)为1的卷积核,将通道数变为16。那么根据公式N=(32-3+2x1)/1+1=32。维度变为[16,32,32],作为残差块的输入(上述的x)。
一、接下来的两层卷积核:第一层卷积层:16个3x3,步长为1,填充为1的卷积核。第二层卷积层同样也是16个3x3,步长为1,填充为1的卷积核。
图像大小:[16,32,32]--第一层卷积,Relu激活-->[16,32,32]--第二层卷积-->[16,32,32]
得到F也是[16,32,32]大小,和x一样那么可以直接进行相加,输入为F+x。
二、接下来的两层卷积核:第一层卷积层:32个3x3,步长为1 ,填充为1的卷积核。第二层卷积层同样也是32个3x3,步长为1,填充为1的卷积核。
图像大小:[16,32,32]--第一层卷积,Relu激活-->[32,32,32]--第二层卷积-->[32,32,32]
得到F是[32,32,32]大小,跟x维度不相同,不能直接进行相加,需对x进行“处理”。
(2)维度不相同如何对x进行处理?
在论文中,作者提出两者方法解决上述问题。
(A)对维度较小的输入直接填充0,使得维度相等,这种方法也不会产生额外的参数。
(B)通过1x1的卷积核来调整大小,使得维度相等。下图中的Ws即是我们要用到的1x1的卷积核。
额外的卷积计算
方法比较:下图A方法是在维度增加时使用0填充法,这样不会导致模型参数增加。B方法是在维度增加时使用1x1的卷积核来改变维度大小。C方法是不管维度是否增加都使用1x1的卷积核。可以看出三者之间的误差比较小,作者得出的结论是1x1的卷积核没必要。
不同填充方法错误率比较
结论
作者在不同的数据集上ImageNet,CIFAR-10都尝试过使用深度残差网络,结果都表明模型的准确率不会随着模型的深度增加而降低。