Deep Residual Learning for Image Recognition
BasicBlock和BottleNeck
BottleNeck是BasicBlock的升级版,其功能也是构造子网络,resnet18和resnet34中使用了BasicBlock,而resnet50、resnet101、resnet152使用了Bottleneck构造网络。
ResNet50的一些实现细节
- ResNet50的4个stage的stride = (1, 2, 2, 2),因为第1个stage前有3×3-s2的max pool,因此不需要stride=2的downsample了
- 每个stage会堆叠多个bottleneck,4个stage的bottleneck个数为(3, 4, 6, 3)。stride=2在stage的第一个bottleneck中的第一个1×1 conv中实现。
- shortcut是Add,而不是Concatenate
- 每个bottleneck是Conv-BN-ReLU、Conv-BN-ReLU、Conv-BN的结构,然后和shortcut进行Add,然后再接ReLU。
- 当stride=2时,每个stage的第一个bottleneck的stride=2,因此第一个shortcut的需要经过1×1-s2的Conv+BN的downsample,再与bottleneck的输出Add。
- 每个stage的第1个bottleneck的shortcut会经过downsample,只不过conv2_x是1×1-s1-conv,目的是为了对齐输入输出的channel;而后3个stage的downsample是1×1-s2-conv,目的是为了h,w和channel都对齐。每个stage除了第1个bottleneck外shortcut都是直接用的输入,没有经过其它处理。