写在前面:
本人小菜鸡一位,这是我的第一篇博客,没什么写作和科研经验,主要目的是为了记录自己对学习内容的理解和便于回顾。本文内容上参考了知乎的一篇文章,然后是根据自己的理解重新作图、编排,主要内容是结合论文以及 PyTorch 官方代码对 ResNet 结构的理解,不涉及网络的优缺点分析以及某个或某些操作的原因解释等内容。
文章如有内容上的错误,请各位大佬及时批评指正,如有涉及侵权等问题,请及时联系我删除文章。小弟初来乍到,大佬多多指教!
文章参考:https://zhuanlan.zhihu.com/p/79378841
ResNet 论文:https://arxiv.org/pdf/1512.03385.pdf
一、ResNet 的不同结构
ResNet 18、ResNet 34 和 ResNet 50 等名称中的数字是各种网络的深度,也就是说“需要通过训练更新参数”的层数(如卷积层、全连接层等)。图 1 是论文里给出每种 ResNet 的具体结构,它们输入图像的大小都是 3 * 224 * 224。
根据图 1,我们可以看出所有的 ResNet 都包含了 5 个 layer(conv1、conv2_x、conv3_x、conv4_x、conv5_x,我们将 conv1 记作 layer 0,依此类推,最后是 layer 4),这个 5 个 layer 之后还有平均池化和全连接层。也就是说,这 5 种 ResNet 网络的总体结构是一致的。
图 1. 不同深度 ResNet 的结构
二、网络深度计算
ResNet 的 5 个 layer 包含的卷积层总数加上最后的全连接层数 1,就是对应的网络深度。以 ResNet 18、ResNet 34 和 ResNet 50 为例,其深度计算如下:
ResNet 18 = 1 + 2 * 2 + 2 * 2 + 2 * 2 + 2 * 2 + 1;
ResNet 34 = 1 + 2 * 3 + 2 * 4 + 2 * 6 + 2 * 3 + 1;
ResNet 50 = 1 + 3 * 3 + 3 * 4 + 3 * 6 + 3 * 3 + 1。
三、两种残差块结构
图 2. 两种残差结构(左:BasicBlock,右:BottleneckBlock)
四、PyTorch 官方 ResNet 18 代码结构
from torchvision import models
res18 = models.resnet18()
print(res18)
五、ResNet 18 结构
以下将结合官方代码进行说明。
· 椭圆形框表示输入或输出;
· 直角矩形框表示卷积层或池化层
· 椭圆框里特征图尺寸表示为 Channel * Height * Width
· 直角矩形框里主要是卷积或池化的一些参数(如卷积核大小、输出通道数、步长、填充)
1、layer 0 与 layer 1 的池化部分
2、layer 1 池化之后的部分
3、layer 2 部分
4、layer 3 与 layer 4 部分
layer 3 与 layer 4 这两部分的结构与 layer 2 结构完全相同,无非就是通道数变多,输出尺寸变小,不再赘述。
5、最后的全连接层
此外,ResNet 18 和 ResNet 34 都是基于 BasicBlock,两个网络的结构非常相似,差别只在于每个 layer 的 Block 数目。
六、ResNet 50 结构
1、layer 0 与 layer 1 的池化部分
该部分与 ResNet 18 完全一致,可参考 ResNet 18。
2、layer 1 池化之后的部分
3、layer 2 部分
4、layer 3 与 layer 4 部分
layer 3 与 layer 4 这两部分的结构与 layer 2 结构完全相同,除了通道数变多,输出尺寸变小,再就是每个 layer 的 Block 数目不同,不再赘述。
5、最后的全连接层
该部分与 ResNet 18 完全一致,可参考 ResNet 18。
此外,ResNet 50、ResNet 101 和 ResNet 152 都是基于 BottleneckBlock,它们的网络结构非常相似,差别只在于每个 layer 的 Block 数目。