分支结构统一与shortcut

左边是Inception结构,不同分支用不同的结构。
右边是ResNeXt的Block,每个分支都是1×1,3×3,1×1的BottleNeck结构,所以叫统一分支。
(1)为什么要统一分支?因为左边的结构是人为设计的,所以想用稍微自然一点的结构。(有ablation study吗?)
增加shortcut发现效果更好
具体实现
class ResNeXtBottleneck(nn.Module): def __init__(self, in_channels, out_channels, stride, cardinality, base_width, widen_factor): super(ResNeXtBottleneck, self).__init__() width_ratio = out_channels / (widen_factor * 64.) D = cardinality * int(base_width * width_ratio)#32*4 32组,每组通道数为4 self.conv_reduce = nn.Conv2d(in_channels, D, kernel_size=1, stride=1, padding=0, bias=False) self.bn_reduce = nn.BatchNorm2d(D) self.conv_conv = nn.Conv2d(D, D, kernel_size=3, stride=stride, padding=1, groups=cardinality, bias=False) self.bn = nn.BatchNorm2d(D) self.conv_expand = nn.Conv2d(D, out_channels, kernel_size=1, stride=1, padding=0, bias=False) self.bn_expand = nn.BatchNorm2d(out_channels) self.shortcut = nn.Sequential() if in_channels != out_channels: self.shortcut.add_module('shortcut_conv', nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, padding=0, bias=False)) self.shortcut.add_module('shortcut_bn', nn.BatchNorm2d(out_channels))
值得注意的是

这里第一块并不是把256维的特征降维到4维的意思,而是降维到32×4维,然后分发给32个分支,每个分支4维的意思
为什么这么说?且看论文中的推导ResNeXt详解 – 大师兄的文章 – 知乎
https://zhuanlan.zhihu.com/p/51075096
ResNeXt的思想其实是由全连接神经网络来的

实际上可以分为3个步骤:
(1)拆分:将 x \bold{x} x拆分为 x i x_i xi
(2)映射:对于每个 x i x_i xi乘上对应的权重
(3)聚合:将所有分支映射后的结果相加
实际上可以用一个公式表示:

如果将映射推广,这里只不过是内积(乘法),如果是神经网络呢?

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222231.html原文链接:https://javaforall.net
