TF15——ResNet
TF15——ResNet
经典卷积网络

ResNet诞生于2015年,当年ImageNet竞赛冠军,Top5错误率为3.57%,ResNet提出了层间残差跳连,引入了前方信息,缓解梯度消失,使神经网络层数增加成为可能,
我们纵览刚刚讲过的四个卷积网络层数:

可见人们在探索卷积实现特征提取的道路上,通过加深网络层数,取得了越来越好的效果,ResNet的作者何凯明在cifar10数据上集做了个实验:

他认为,单纯堆叠神经网络层数,会使神经网络模型退化,以至于后面的特征丢失了前面特征的原本摸样

于是他用了一根跳连线,将前面的特征直接接到了后边,使输出结果H(x),包含了堆叠卷积的非线性输出F(x)和跳过这两层堆叠卷积直接连接过来的恒等映射x,让他们对应元素相加,这一操作有效缓解了神经网络模型堆叠导致的退化,使得神经网络可以向着更深层级发展
注意:ResNet块中的”+“与Inception块中的”+“是不同的
- Inception块中的“+”是沿深度方向叠加(千层蛋糕层数叠加)
- ResNet块中的“+”是特征图对应元素值相加(矩阵值相加)

ResNet块中有两种情况,:
- 情况一:用图中的实线表示,这种情况,两层堆叠卷积,没有改变特征图的维度,也就是它们特征图的个数,高,宽和深度都相同,可以直接将F(x)和x直接相加
- 情况二:用图中的虚线表示,这种情况,两层堆叠卷积改变特征图的维度,需要借助
1*1卷积来调整x的维度使W(x)和F(x)的维度一致

把ResNet块的两种结构,封装到一个橙色块中,写出ResnetBlock类,每调用一次ResnetBlock类,会生成一个黄色块

-
如果堆叠卷积层前后维度不同,residual_path等于1调用红色块里的代码,使用
1*1卷积操作,调整输入特征图inputs的尺寸或深度后,将堆叠卷积输出特征y和if语句计算出deresidual相加,过激活,输出 -
如果堆叠卷积层前后维度相同,不执行红色块里的代码,使用
1*1卷积操作,直接将将堆叠卷积输出特征y和输入特征图inputs相加,过激活,输出

上图左侧给出的框图是ResNet18用CBAPD表示的结构,用刚刚写出的ResNet块搭建这个结构
- ResNet18的第一层是个卷积,然后是8个ResNet块,最后十一层全连接
- 每一个ResNet有两层卷积,一共是18层网络
详细代码解释:
-
第一层采用64个
3*3的卷积核,步长为1,全零填充,采用BN操作,relu激活,这个紫色块描述完成 -
接下来的结构描述的是四个橙色块,第一个橙色块,是两条实线跳连的ResNet块,第二三四个橙色块,是先虚线再实线跳连的ResNet块,
-
用一个FOR循环写出来,循环次数是由参数列表元素个数决定,这里列表赋值时2,2,2,2四个元素,所以最外层for循环执行四次,每次进来,根据当前是第几个元素,选择residual_path=True(用虚线链接)和residual_path=False(用实线链接)
-
调用ResnetBlock生成左边ResNet18结构中的一个橙色块
-
-
经过平均全局池化和全连接得到结果
注意:为了加速模型收敛,我把batch_size调到了128
可以运行class5中的所有代码,尝试更改学习率等超参数,微调网络结构,通过一些优化策略,提升cifar10测试集的准确率
经典卷积网络小结
