TF15——ResNet


TF15——ResNet

经典卷积网络

image-20220320140919084

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

我们纵览刚刚讲过的四个卷积网络层数:

image-20220320181815406

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

image-20220320182023937

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

image-20220320182611735

于是他用了一根跳连线,将前面的特征直接接到了后边,使输出结果H(x),包含了堆叠卷积的非线性输出F(x)和跳过这两层堆叠卷积直接连接过来的恒等映射x,让他们对应元素相加,这一操作有效缓解了神经网络模型堆叠导致的退化,使得神经网络可以向着更深层级发展

注意:ResNet块中的”+“与Inception块中的”+“是不同的

  • Inception块中的“+”是沿深度方向叠加(千层蛋糕层数叠加)
  • ResNet块中的“+”是特征图对应元素值相加(矩阵值相加)

image-20220320183429269

ResNet块中有两种情况,:

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

image-20220320183528085

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

image-20220320183737411

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

  • 如果堆叠卷积层前后维度相同,不执行红色块里的代码,使用1*1卷积操作,直接将将堆叠卷积输出特征y和输入特征图inputs相加,过激活,输出

image-20220320184616120

上图左侧给出的框图是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测试集的准确率

经典卷积网络小结

image-20220320190458075