PaddleClas:ResNet_vd结构

 1:ResNet的不同结构

va结构:

ResNet最早提出时的结构,在降采样残差模块这个部分,在左边的特征变换通路中(Path A),第一个1x1卷积部分就行了降采样,从而导致信息丢失(卷积的kernel size为1,stride为2,输入特征图中 有部分特征没有参与卷积的计算);

在vb结构:

把降采样的步骤从最开始的第一个1x1卷积调整到中间的3x3卷积中,从而避免了信息丢失的问题,PaddleClas中的ResNet模型默认就是ResNet_vb;

vc结构:

则是将最开始这个7x7的卷积变成3个3x3的卷积,在感受野不变的情况下,计算量和存储大小几乎不变,而且实验证明精度相对于vb结构有所提升;

vd结构:

是修改了降采样残差模块右边的特征通路(Path B)。把降采样的过程由平均池化这个操作去替代了,这一系列的改进(va->vd),几乎没有带来新增的预测耗时,结合适当的训练策略,比如说标签平滑以及mixup数据增广,精度可以提升高达2.7%。

2:ResNet中的BasicBlock与bottleneck

ResNet的网络结构

ResNet系列中有两种不同的block,分别是basic-block和bottleneck-block,堆叠较多这样的block组成了ResNet网络。

  • basic-block是带有shortcut的两个3x3的卷积核的堆叠,左图
  • bottleneck-block是带有shortcut的1x1卷积核、3x3卷积核、1x1卷积核的堆叠,右图
  • basic-block中有两层,bottleneck-block有三层

                basic block                                                              bottleneck block

左边是BasicBlock:ResNet18和ResNet34就由其堆叠。

右边是BottleNeck:ResNet50、ResNet101、ResNet152就由其堆叠。

下面以ResNet18为例,分析网络结构的构建。

根据上面表格中的表述,可以将整个网络的主体部分分为4块,conv2_x,conv3_x,conv4_x,conv5_x,在所有的结构中conv2_x这一部分都没有对的大小做改变feature map。而conv3_x,conv4_x,conv5_x则都将对feature map缩小两倍。

ResNet18:

在conv2_x中共有2个basicBlock,此部分的feature map输入(conv1的输出)channel为64,输出也是64,输入和输出的channel相同,且feature size也相同,因此可以直接相加,所以就不需要在shortcut中添加那个1*1的卷积了。

在conv3_x中也有2个basicBlock,此部分的输入channel是64,而输出channel是128,因此不匹配。而且,在这个模块中将feature size缩小了两倍,所以在conv3_x中的第一个basicBlock中,使用了stride=2,此时feature map的size也已经缩小了,所以需要在shortcut中添加1*1卷积,并且stride=2,让输入和输出具有相同的形状,从而可以相加。 在conv3_x的第二个block则不要shortcut中的1*1卷积,也没有出现stride=2的情况,因为这个block的输入和输出形状相同。

conv4_x、conv5_x和conv3_x的情况一模一样了。所以不做具体分析了。

总结:
ResNet中的每个conv模块(conv2_x,conv3_x,conv4_x,conv5_x)中,如果当前模块的输入channel以及feature map size与输出的不一样,那么会在当前模块的第一个block(basicBlock或bottleNeck)中使用stride=2将feature map size缩小,并且在shortcut中添加一个1*1的卷积,用来将输入channel和输出channel进行匹配。当前模块的所有非第一个block,都是采用正常的结构(stride=1, 并且shortcut中没有1*1卷积)

参考:

1:ResNet结构分析 - 知乎

猜你喜欢

转载自blog.csdn.net/lilai619/article/details/131548661