残差结构
为了方便对比,这里左图输入以256(论文为64)来计算。
左图:3x3x256x256+3x3x256x256=1179648
右图:1x1x256x64+3x3x64x64+1x1x64x256=69632
卷积计算:out=(in-k+2p) / s + 1
使用残差结构可以极大减少计算量。
整体网络结构
下采样由conv3_1,conv4_1,conv5_1完成,步幅为2。
对restnet18、34而言:
主分支和shortcut的输出特征矩阵shape必须相同。
由于conv2_x的输入是56x56x64,输出也是56x56x64,输入输出没有变化,可以直接相加。即实边的残差结构。
对于conv3_1来说,输入是56x56x64,输出为28x28x128,输入输出发生了变化,则对应的卷积核数量为128,步幅为2,这样可以与上一层的conv2_x进行相加。即虚边的残差结构。
后续的conv4_1和conv5_1也是类似操作。
这里第一个卷积的卷积核数量为128,最后一个1x1的卷积的卷积核数量是128,保持不变。
对restnet50-152而言:
主分支和shortcut的输出特征矩阵shape必须相同。
由于conv2_x的输入是56x56x256,输出也是56x56x256,输入输出没有变化,直接相加。即实边的残差结构。
虚线残差结构的主分支上,第一个1x1卷积步幅是2,第二个3x3卷积步幅是1,但在pytorch官方实现中,第一个卷积1x1卷积步幅是1,第二个3x3卷积步幅是2。这样能够在imagenet的top1上提升约0.5%的准确率。
详细参考:https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch
这里第一个卷积的卷积核数量为128,最后一个1x1的卷积的卷积核数量是512,即4倍。
Batch Normalization
BN的目的是使我们的一批(batch)的特征图满足均值为0,方差为1的分布规律。
正向传播统计得到均值和方差;反向传播训练得到超参数
https://blog.csdn.net/qq_37541097/article/details/104434557