论文传送门:Deep Residual Learning for Image Recognition
ResNet的出发点:
根据以往经验,模型网络层数越深,模型性能越好。但实际上,在网络层数达到一定深度时,模型的性能会随着层数的增加而不断降低。
作者分析,这可能由两个原因导致:
①深层网络容易导致梯度爆炸或梯度消失;
②深层网络存在模型退化问题。
为解决这两个问题,作者引入Batch Normalization层和Residual结构。
Residual结构:
①特征x经过多个ConvBN(ReLU)层,得到F(x);
②特征x不进行任何计算,得到恒等映射的x;
③F(x)+x,经过ReLU得到最终的输出。
ResNet34的结构:
不断堆叠Residual结构,当Residual结构实现下采样(特征图尺寸减半)时,shortcut边的x需要经过1x1Conv实现通道数的变化(图中用虚线表示)。
不同规模的ResNet:
注意,ResNet18、34和ReNet50、101、152所使用的Residual结构有所不同。
import torch
import torch.nn as nn
class BasicBlock(nn.Module): # 定义残差块,resnet18、resnet34使用此残差块
expansion = 1 # 残差操作维度变化倍数
def __init__(self, in_channel, out_channel, stride=1, downsample=None): # 初始化方法
super(BasicBlock, self).__init__() # 继承初始化方法
self.conv1