1.ResNeXt网络详解
网络创新点:
(1)更新了block
组卷积(Group Convolution)
普通卷积:

假设高和宽为k的输入特征矩阵channel=Cin,使用n个channel=Cin的卷积核进行处理,得到channel=n的输出特征矩阵。
此时需要的参数个数为
输入特征矩阵的高 x 宽 x channel x 卷积核个数
组卷积:

在上图中,假设输入特征矩阵channel=Cin,尺寸为k x k,
将输入特征矩阵的channel划分成g个组,将这g个组分别进行卷积操作,
如果使用n/g个卷积核,就能得到g个组的channel=n/g的输出特征矩阵,
通过GConv所需要的参数为=
其中Cin/g是由于将输入特征矩阵的channel划分成了g组,所以对每一个组的每一个卷积核个数为Cin/g;n/g是由于为了得到channel=n的特征矩阵,对于每个组,就需要使用n/g个卷积核;g是由于划分了g个组。
GConv相比较普通卷积,所需要的参数减少了1/g。
如果分组个数g、输入特征矩阵的channel与输出特征矩阵的channel一致时,此时相当于对输入特征矩阵的每一个channel分配了一个channel为1的卷积核进行卷积,此时就是DWConv。
DW卷积:MobileNetv1、v2网络详解
ResNetXt的block

上图三个block在数学计算上完全等价。
在( c )中,首先通过1x1的卷积层将输入特征矩阵的channel从256降维到128;再通过3x3的32组group卷积对其进行处理;再通过1x1的卷积层进行将特征矩阵的channel从128升维到256;最后主分支与捷径分支的输出进行相加得到最终输出。
因此可以将ResNett网络中的Block替换成使用组卷积的Block。
ResNetXt的网络结构

图中ResNeXt-50(32 x 4d)中的32对应group数、4d对应组卷积中每一个组所采用的卷积核个数(4x32=128)。
为什么group数要设置为32:原论文作者得出结论group数越大,错误率越低。
且block层数小于3,组卷积block的就没有意义。
2.使用pytorch搭建模型
(1)model.py
只需要在深层次的ResNet网络中进行修改即可:
def __init__(self, in_channel, out_channel, stride=1, downsample=None, #定义初始函数及残差结构所需要使用的一系列层结构
groups=1, width_per_group=64): #resnext多传入groups和width_per_group
super(Bottleneck, self).__init__()
width = int(out_channel * (width_per_group / 64.)) * groups #计算resnet和rennext网络第一个卷积层和第二个卷积层采用的卷积核个数
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=width, #对于resnet,不传入groups和width_per_group两个参数,out_chann

最低0.47元/天 解锁文章
9万+

被折叠的 条评论
为什么被折叠?



