引言
随着深度学习的发展,简单的浅层网络卷积结构已经无法满足需求。而一味的加深网络结构,又会使网络很难收敛。研究者们都在网络结构上进行创新。而一种新型结构Resnet在ImageNet比赛上拔得头筹,拿下识别冠军,引起了不小的轰动
基础结构 残差块
残差网络是由一个个残差块来进行组成的
这是一种跳跃连接的方式
第一条线路经过常规的卷积,激活,批量归一化后,在输出的时候与输入进行相加。
最后整个输出再进行一次Relu激活
因为输入x有一条线路是跳过其中的卷积部分,所以能直接地到达网络内部。避免了传统网络规模加大,导致梯度消失或爆炸情况。
结构
整体结构上 论文作者是先用7x7窗口的卷积层对图像进行捕获,经过批量归一化激活后,再输入到一个个残差块当中
第二种残差块是借助1x1窗口的卷积核对输入进行降维度,最后再用一个1x1窗口的卷积核将维度还原回来。其实1x1窗口的卷积核可以近似看成一种全连接层。而去除了池化层之后,也不至于丢失太多细节和特征
先是将输入进来的256维经过1x1的卷积核降维到64,再进行3x3窗口卷积,最后再还原到256维度与输入相加
另外一种降低维度的残差块结构如下
他额外通过1x1卷积核的窗口,但是步幅设置为2,所以宽度高度会降低一半。
此时另外一条线路的卷积,在一开始使用3x3的窗口,步幅也设置为2,这样才能达到两条线路的维度相同,从而最后能成功相加
这里要提及的是,为了避免池化层中对细节特征的损失,通常Resnet是不设置池化层的,因为步幅为2的1x1卷积核已经能够对维度减半
另外,在Restnet后续版本,作者将残差块原先的
卷积 —> 批量归一化 —> 激活结构改成了 批量归一化 —> 激活 —> 卷积的结构
代码 实现
首先我们来实现两种残差块,以及预卷积模块
from keras import backend as K
from keras.models import *
from keras.layers import