ResNet
ResNet结构
不论是多少层的ResNet网络,它们都有以下共同点:
- 网络一共包含5个卷积组,每个卷积组中包含1个或多个基本的卷积计算过程(Conv-> BN->ReLU)
- 每个卷积组中包含1次下采样操作,使特征图大小减半,下采样通过以下两种方式实现:
- 最大池化,步长取2,只用于第2个卷积组(Conv2_x)
- 卷积,步长取2,用于除第2个卷积组之外的4个卷积组
- 第1个卷积组只包含1次卷积计算操作,5种典型ResNet结构的第1个卷积组完全相同,卷积核均为7x7, 步长均为2
- 第2-5个卷积组都包含多个相同的残差单元,在很多代码实现上,通常把第2-5个卷积组分别叫做Stage1、Stage2、Stage3、Stage4
- 首先是第一层卷积使用kernel 7∗7,步长为2,padding为3。之后进行BN,ReLU和maxpool。这些构成了第一部分卷积模块conv1。
- 然后是四个stage,有些代码中用make_layer()来生成stage,每个stage中有多个模块,每个模块叫做building block,resnet18= [2,2,2,2],就有8个building block。注意到他有两种模块BasicBlock和Bottleneck。resnet18和resnet34用的是BasicBlock,resnet50及以上用的是Bottleneck。无论BasicBlock还是Bottleneck模块,都用到了**残差连接(shortcut connection)**方式:
ResNet中, 使用了如上2种‘shortcut’。
下面分别选取一个浅层网络ResNet18以及深层网络ResNet50 来详细解析一下网络结构以及数据流。
ResNet18
ResNet18的18层代表的是带有权重的18层,包括卷积层和全连接层,不包括池化层和BN层。
layer1
ResNet18 ,使用的是 BasicBlock。layer1,特点是没有进行降采样,卷积层的 stride = 1,不会降采样。在进行 shortcut 连接时,也没有经过 downsample 层。
layer2,layer3,layer4
而 layer2,layer3,layer4 的结构图如下,每个 layer 包含 2 个 BasicBlock,但是第 1 个 BasicBlock 的第 1 个卷积层的 stride = 2,会进行降采样。在进行 shortcut 连接时,会经过 downsample 层,进行降采样和降维。
ResNet50
layer1
在 layer1 中,首先第一个 Bottleneck 只会进行升维,不会降采样。shortcut 连接前,会经过 downsample 层升维处理。第二个 Bottleneck 的 shortcut 连接不会经过 downsample 层。
layer2,layer3,layer4
而 layer2,layer3,layer4 的结构图如下,每个 layer 包含多个 Bottleneck,但是第 1 个 Bottleneck 的
3
3
3 ×
3
3
3卷积层的 stride = 2,会进行降采样。在进行 shortcut 连接时,会经过 downsample 层,进行降采样和降维。