GIS与Climate

V1

2022/12/04阅读：30主题：默认主题

# 架构

• 层数堆叠
• split-transform-merge思想（就是分割-转换-合并，对于于上图）

# 代码

``import torch.nn as nnimport math__all__ = ['ResNeXt', 'resnext18', 'resnext34', 'resnext50', 'resnext101',           'resnext152']def conv3x3(in_planes, out_planes, stride=1):    """3x3 convolution with padding"""    return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,                     padding=1, bias=False)class BasicBlock(nn.Module):    expansion = 1    def __init__(self, inplanes, planes, stride=1, downsample=None, num_group=32):        super(BasicBlock, self).__init__()        self.conv1 = conv3x3(inplanes, planes*2, stride)        self.bn1 = nn.BatchNorm2d(planes*2)        self.relu = nn.ReLU(inplace=True)        self.conv2 = conv3x3(planes*2, planes*2, groups=num_group)        self.bn2 = nn.BatchNorm2d(planes*2)        self.downsample = downsample        self.stride = stride    def forward(self, x):        residual = x        out = self.conv1(x)        out = self.bn1(out)        out = self.relu(out)        out = self.conv2(out)        out = self.bn2(out)        if self.downsample is not None:            residual = self.downsample(x)        out += residual        out = self.relu(out)        return outclass Bottleneck(nn.Module):    expansion = 4    def __init__(self, inplanes, planes, stride=1, downsample=None, num_group=32):        super(Bottleneck, self).__init__()        self.conv1 = nn.Conv2d(inplanes, planes*2, kernel_size=1, bias=False)        self.bn1 = nn.BatchNorm2d(planes*2)        self.conv2 = nn.Conv2d(planes*2, planes*2, kernel_size=3, stride=stride,                               padding=1, bias=False, groups=num_group)        self.bn2 = nn.BatchNorm2d(planes*2)        self.conv3 = nn.Conv2d(planes*2, planes * 4, kernel_size=1, bias=False)        self.bn3 = nn.BatchNorm2d(planes * 4)        self.relu = nn.ReLU(inplace=True)        self.downsample = downsample        self.stride = stride    def forward(self, x):        residual = x        out = self.conv1(x)        out = self.bn1(out)        out = self.relu(out)        out = self.conv2(out)        out = self.bn2(out)        out = self.relu(out)        out = self.conv3(out)        out = self.bn3(out)        if self.downsample is not None:            residual = self.downsample(x)        out += residual        out = self.relu(out)        return outclass ResNeXt(nn.Module):    def __init__(self, block, layers, num_classes=1000, num_group=32):        self.inplanes = 64        super(ResNeXt, self).__init__()        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,                               bias=False)        self.bn1 = nn.BatchNorm2d(64)        self.relu = nn.ReLU(inplace=True)        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)        self.layer1 = self._make_layer(block, 64, layers[0], num_group)        self.layer2 = self._make_layer(block, 128, layers[1], num_group, stride=2)        self.layer3 = self._make_layer(block, 256, layers[2], num_group, stride=2)        self.layer4 = self._make_layer(block, 512, layers[3], num_group, stride=2)        self.avgpool = nn.AvgPool2d(7, stride=1)        self.fc = nn.Linear(512 * block.expansion, num_classes)        for m in self.modules():            if isinstance(m, nn.Conv2d):                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels                m.weight.data.normal_(0, math.sqrt(2. / n))            elif isinstance(m, nn.BatchNorm2d):                m.weight.data.fill_(1)                m.bias.data.zero_()    def _make_layer(self, block, planes, blocks, num_group, stride=1):        downsample = None        if stride != 1 or self.inplanes != planes * block.expansion:            downsample = nn.Sequential(                nn.Conv2d(self.inplanes, planes * block.expansion,                          kernel_size=1, stride=stride, bias=False),                nn.BatchNorm2d(planes * block.expansion),            )        layers = []        layers.append(block(self.inplanes, planes, stride, downsample, num_group=num_group))        self.inplanes = planes * block.expansion        for i in range(1, blocks):            layers.append(block(self.inplanes, planes, num_group=num_group))        return nn.Sequential(*layers)    def forward(self, x):        x = self.conv1(x)        x = self.bn1(x)        x = self.relu(x)        x = self.maxpool(x)        x = self.layer1(x)        x = self.layer2(x)        x = self.layer3(x)        x = self.layer4(x)        x = self.avgpool(x)        x = x.view(x.size(0), -1)        x = self.fc(x)        return xdef resnext18( **kwargs):    """Constructs a ResNeXt-18 model.    """    model = ResNeXt(BasicBlock, [2, 2, 2, 2], **kwargs)    return model``

# 知识点速记

## 参考

【1】XIE S, GIRSHICK R, DOLLáR P, et al. Aggregated residual transformations for deep neural networks[C]//Proceedings of the IEEE conference on computer vision and pattern recognition.2017:1492-1500.
【2】https://github.com/miraclewkf/ResNeXt-PyTorch

V1