五 CNN经典网络模型:ResNet简介及代码实现(PyTorch超详细注释版

目录
一、开发背景
二、网络结构
三、模型特点
四、代码实现
1. model.py
2. train.py
3. .py
4. .py
五、参考内容
一、开发背景
残差神经网络()是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的,斩获2015年竞赛中分类任务第一名,目标检测第一名 。残差神经网络的主要贡献是发现了“退化现象()”,并针对退化现象发明了 “直连边/短连接( )”,极大的消除了深度过大的神经网络训练困难问题 。神经网络的“深度”首次突破了100层、最大的神经网络甚至超过了1000层 。
二、网络结构
的前两层为输出通道数为64、步幅为2的7×7卷积层,后接步幅为2的3×3的最大池化层 。不同于,在每个卷积层后增加了批量规一化层 。接着,使用4个由残差块组成的模块,每个模块使用若干个同样输出通道数的残差块 。第一个模块的通道数同输入通道数一致 。由于之前已经使用了步幅为2的最大池化层,所以无须减小高和宽 。之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半 。的一个重要设计原则是:当 map大小降低一半时,map的数量增加一倍,这保持了网络层的复杂度 。最后,输入全局平均汇聚层,以及全连接层输出 。通过配置不同的通道数和模块里的残差块数可以得到不同的模型,例如更深的含152层的-152 。34层如下图所示:
残差单元(残差块)

五  CNN经典网络模型:ResNet简介及代码实现(PyTorch超详细注释版

文章插图
团队分别构建了带有“直连边( )”的残差块、以及降采样的残差块,区别是降采样残差块的直连边增加了一个1×1的卷积操作 。对于直连边,当输入和输出维度一致时,可以直接将输入加到输出上,这相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度 。但是当维度不一致时,这就不能直接相加,通过添加1×1卷积调整通道数 。这种残差学习结构可以通过前向神经网络+直连边实现,而且整个网络依旧可以通过端到端的反向传播训练 。结构如下图所示:
三、模型特点 1.超深的网络结构(突破1000层)
【五CNN经典网络模型:ResNet简介及代码实现(PyTorch超详细注释版】网络深度为什么重要?因为CNN能够提取low/mid/high-level的特征,网络的层数越多,意味着能够提取到不同level的特征越丰富 。并且,越深的网络提取的特征越抽象,越具有语义信息 。
2.使用Batch
为什么不能简单地增加网络层数?对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸 。Batch 可以解决该问题的,因此可以训练到几十层的网络 。
3.残差块
随着网络层数增加,出现了新的问题:退化问题,在训练集上准确率饱和甚至下降了 。这个不能解释为过拟合,因为过拟合表现为在训练集上表现更好才对 。退化问题说明了深度网络不能很简单地被很好地优化 。作者通过实验说明:通过浅层网络y=x 等同映射构造深层模型,结果深层模型并没有比浅层网络有更低甚至等同的错误率,推断退化问题可能是因为深层的网络很那难通过训练利用多层网络拟合同等函数 。
怎么解决退化问题?深度残差网络 。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络 。所以要解决的就是学习恒等映射函数 。但是直接让一些层去拟合一个潜在的恒等映射函数H(x) = x,比较困难,这可能就是深层网络难以训练的原因 。但是,如果把网络设计为H(x) = F(x) + x 。我们可以转换为学习一个残差函数F(x) = H(x) - x. 只要F(x)=0,就构成了一个恒等映射H(x) = x. 此外,拟合残差会更加容易 。