Ejemplo n.º 1
0
 def __init__(self):
     super(Vgg, self).__init__()
     self.vgg = models.vgg16()  # vgg16模型
     del self.vgg.avgpool
     del self.vgg.classifier  # 分别去掉已有vgg16的模型中的池化层和分类器
     self.vgg_1 = models.vgg16()  # 将输入通道改为1的vgg16模型
     del self.vgg_1.avgpool
     del self.vgg_1.classifier  # 分别去掉已有vgg16的模型中的池化层和分类器
     origin_dicts = torch.load('pth/vgg16-397923af.pth')  # 预训练模型中vgg网络的参数
     model_dicts = self.vgg.state_dict()  # 自定义的去掉后面几层的网络的参数列表
     pretrained_dicts = {
         k: v
         for k, v in origin_dicts.items() if k in model_dicts
     }  # 预训练模型参数在自定义模型中有的参数列表
     model_dicts.update(pretrained_dicts)  # 更新自定义的模型参数
     self.vgg_se = nn.Sequential()
     for i, fea in enumerate(self.vgg.features):
         print(i, fea)
         self.vgg_se.add_module(str(i), fea)
         if i == 16:
             self.vgg_se.add_module('se1', SELayer(256))
         if i == 23:
             self.vgg_se.add_module('se2', SELayer(512))
         if i == 30:
             self.vgg_se.add_module('se3', SELayer(512))
     model_dicts_se = self.vgg_se.state_dict()
     pretrained_dicts_se = {
         k[9:]: v
         for k, v in origin_dicts.items() if k[9:] in model_dicts_se
     }
     model_dicts_se.update(pretrained_dicts_se)
     self.vgg_se.load_state_dict(model_dicts_se)
     print(self.vgg_se[0])
Ejemplo n.º 2
0
 def __init__(self, planes=576, scale=1.0, reduction=16):
     super(InceptionResC, self).__init__()
     self.scale = scale
     self.relu = nn.ReLU(inplace=False)
     self.branch_0 = BasicConv2d(planes,
                                 planes // 8,
                                 kernel_size=1,
                                 stride=1)
     self.branch_1 = nn.Sequential(
         BasicConv2d(planes, planes // 8, kernel_size=1, stride=1),
         BasicConv2d(planes // 8,
                     planes // 7,
                     kernel_size=(1, 3),
                     stride=1,
                     padding=(0, 1)),
         BasicConv2d(planes // 7,
                     planes // 6,
                     kernel_size=(3, 1),
                     stride=1,
                     padding=(1, 0)))
     self.branch_all = BasicConv2d(planes // 8 + planes // 6,
                                   planes,
                                   kernel_size=1,
                                   stride=1)
     self.se = SELayer(planes, reduction)
Ejemplo n.º 3
0
 def __init__(self, planes=96, scale=1.0, reduction=16):
     super(InceptionResA, self).__init__()
     self.relu = nn.ReLU(inplace=False)
     self.scale = scale
     self.branch_0 = BasicConv2d(planes,
                                 planes // 12,
                                 kernel_size=1,
                                 stride=1)
     self.branch_1 = nn.Sequential(
         BasicConv2d(planes, planes // 12, kernel_size=1, stride=1),
         BasicConv2d(planes // 12,
                     planes // 12,
                     kernel_size=3,
                     stride=1,
                     padding=1))
     self.branch_2 = nn.Sequential(
         BasicConv2d(planes, planes // 12, kernel_size=1, stride=1),
         BasicConv2d(planes // 12,
                     planes // 8,
                     kernel_size=3,
                     stride=1,
                     padding=1),
         BasicConv2d(planes // 8,
                     planes // 6,
                     kernel_size=3,
                     stride=1,
                     padding=1))
     self.branch_all = BasicConv2d(planes // 3,
                                   planes,
                                   kernel_size=1,
                                   stride=1)
     self.se = SELayer(planes, reduction)
Ejemplo n.º 4
0
    def __init__(self, inplanes, planes, stride=1, downsample=None, kernel_size=1, conv_num=3):
        super(BasicBlock2d, self).__init__()
        self.bn1 = nn.BatchNorm2d(inplanes)
        self.relu = nn.ReLU(inplace=True)
        self.conv1 = nn.Conv2d(planes, planes, kernel_size=(1, kernel_size),
                               stride=stride, bias=False, padding=(0, kernel_size // 2))
        self.bn2 = nn.BatchNorm2d(planes)

        self.downsample = downsample
        self.stride = stride
        self.layers1 = nn.Sequential()
        self.layers1.add_module("BatchNorm2d", self.bn1)
        self.layers1.add_module('relu', self.relu)
        self.layers1.add_module('conv1', self.conv1)
        self.layers2 = None
        if downsample is not None:
            self.layers2 = nn.Sequential()
            self.layers2.add_module('downsample', self.downsample)
            for i in range(1, conv_num):
                self.layers2.add_module('downsample', self.downsample)

        for i in range(1, conv_num):
            if conv_num == i - 1:
                self.layers1.add_module('dropout',
                                        nn.Dropout(.2)
                                        )
            self.layers1.add_module("BatchNorm2d", self.bn2)
            self.layers1.add_module('relu', self.relu2)
            self.layers1.add_module('conv1',
                                    # self.conv1
                                    nn.Conv2d(planes, planes, kernel_size=(1, kernel_size),
                                              stride=1, bias=False, padding=(0, kernel_size // 2))
                                    )

        self.se = SELayer(planes, reduction=16)
Ejemplo n.º 5
0
 def __init__(self,
              inplanes,
              planes,
              stride=1,
              downsample=None,
              groups=1,
              base_width=64,
              dilation=1,
              norm_layer=None,
              *,
              reduction=16):
     super(SEBottleneck, self).__init__()
     self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)
     self.bn1 = nn.BatchNorm2d(planes)
     self.conv2 = nn.Conv2d(planes,
                            planes,
                            kernel_size=3,
                            stride=stride,
                            padding=1,
                            bias=False)
     self.bn2 = nn.BatchNorm2d(planes)
     self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)
     self.bn3 = nn.BatchNorm2d(planes * 4)
     self.relu = nn.ReLU(inplace=True)
     self.se = SELayer(planes * 4, reduction)
     self.downsample = downsample
     self.stride = stride
    def __init__(self, num_classes=3):
        super(WzmModel2, self).__init__()
        self.fusion_upchannel = nn.Conv2d(5, 16, kernel_size=3, stride=1, padding=1)
        self.se = SELayer(16, reduction=4)
        self.conv_up = nn.Conv2d(16, 3, kernel_size=1)
        self.relu_up = nn.ReLU(inplace=True)
        self.conv_down1 = nn.Conv2d(512, 256, kernel_size=1)
        self.conv_down2 = nn.Conv2d(256, 64, kernel_size=1)
        self.relu_down = nn.ReLU(inplace=True)

        self.vgg = models.vgg16()
        del self.vgg.classifier
        origin_dicts = torch.load('pth/vgg16-397923af.pth')  # 预训练模型中vgg网络的参数
        model_dicts = self.vgg.state_dict()  # 自定义的去掉后面几层的网络的参数列表
        pretrained_dicts = {k: v for k, v in origin_dicts.items() if k in model_dicts}  # 预训练模型参数在自定义模型中有的参数列表
        model_dicts.update(pretrained_dicts)  # 更新自定义的模型参数
        self.vgg.load_state_dict(model_dicts)  # 加载更新后的自定义的网络模型参数

        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(64 * 4 * 4, 512),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(512, 256),
            nn.ReLU(inplace=True),
            nn.Linear(256, num_classes),
        )
Ejemplo n.º 7
0
 def __init__(self, inplanes, planes, stride=1, downsample=None, reduction=16):
     super(SEBasicBlock, self).__init__()
     self.conv1 = conv3x3(inplanes, planes, stride)
     self.bn1 = nn.BatchNorm2d(planes)
     self.relu = nn.ReLU(inplace=True)
     self.conv2 = conv3x3(planes, planes, 1)
     self.bn2 = nn.BatchNorm2d(planes)
     self.se = SELayer(planes, reduction)
     self.downsample = downsample
     self.stride = stride
Ejemplo n.º 8
0
 def __init__(self, inplanes, planes, stride=1, reduction=16):
     super(CifarSEBasicBlock, self).__init__()
     self.conv1 = conv3x3(inplanes, planes, stride)
     self.bn1 = nn.BatchNorm2d(planes)
     self.relu = nn.ReLU(inplace=True)
     self.conv2 = conv3x3(planes, planes)
     self.bn2 = nn.BatchNorm2d(planes)
     self.se = SELayer(planes, reduction)
     if inplanes != planes:
         self.downsample = nn.Sequential(nn.Conv2d(inplanes, planes, kernel_size=1, stride=stride, bias=False),
                                         nn.BatchNorm2d(planes))
     else:
         self.downsample = lambda x: x
     self.stride = stride
 def __init__(self,
              inplanes,
              planes,
              cfg,
              stride=1,
              downsample=None,
              reduction=16):
     # cfg should be a number in this case
     super(SEBasicBlock, self).__init__()
     self.conv1 = conv3x3(cfg, planes, stride)
     self.bn1 = nn.BatchNorm2d(planes)
     self.se = SELayer(planes, reduction)
     self.relu = nn.ReLU(inplace=True)
     self.conv2 = conv3x3(planes, cfg)
     self.bn2 = nn.BatchNorm2d(cfg)
     self.downsample = downsample
     self.stride = stride
 def __init__(self,
              inplanes,
              planes,
              cfg,
              stride=1,
              downsample=None,
              reduction=16):
     super(SEBottleneck, self).__init__()
     self.conv1 = conv1x1(inplanes, cfg)
     self.bn1 = nn.BatchNorm2d(cfg)
     self.conv2 = conv3x3(cfg, cfg, stride)
     self.bn2 = nn.BatchNorm2d(cfg)
     self.se = SELayer(cfg, reduction)
     self.conv3 = conv1x1(cfg, cfg * 4)
     self.bn3 = nn.BatchNorm2d(cfg * 4)
     self.relu = nn.ReLU(inplace=True)
     self.downsample = downsample
     self.stride = stride
Ejemplo n.º 11
0
    def __init__(self, num_classes=3):
        super(WzmModel2, self).__init__()
        self.fusion_upchannel = nn.Conv2d(5,
                                          16,
                                          kernel_size=3,
                                          stride=1,
                                          padding=1)
        self.se = SELayer(16, reduction=4)
        self.conv_up = nn.Conv2d(3, 16, kernel_size=1)
        self.relu_up = nn.ReLU(inplace=True)
        self.features1 = nn.Sequential(
            # [16, 3, 128, 128]
            nn.Conv2d(16,
                      64,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(64,
                      64,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(64,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(128,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(128,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(256,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False))

        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(128 * 4 * 4, 512),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(512, 256),
            nn.ReLU(inplace=True),
            nn.Linear(256, num_classes),
        )
Ejemplo n.º 12
0
    def __init__(self, num_classes, aux_logits=True, transform_input=False):
        super(SEInception3, self).__init__()
        model = Inception3(num_classes=num_classes,
                           aux_logits=aux_logits,
                           transform_input=transform_input)
        model.Mixed_5b.add_module("SELayer", SELayer(192))
        model.Mixed_5c.add_module("SELayer", SELayer(256))
        model.Mixed_5d.add_module("SELayer", SELayer(288))
        model.Mixed_6a.add_module("SELayer", SELayer(288))
        model.Mixed_6b.add_module("SELayer", SELayer(768))
        model.Mixed_6c.add_module("SELayer", SELayer(768))
        model.Mixed_6d.add_module("SELayer", SELayer(768))
        model.Mixed_6e.add_module("SELayer", SELayer(768))
        if aux_logits:
            model.AuxLogits.add_module("SELayer", SELayer(768))
        model.Mixed_7a.add_module("SELayer", SELayer(768))
        model.Mixed_7b.add_module("SELayer", SELayer(1280))
        model.Mixed_7c.add_module("SELayer", SELayer(2048))

        self.model = model
Ejemplo n.º 13
0
    def __init__(self, num_classes=3, num_level=3, pool_type='max_pool', use_spp=False, use_se=False):
        super(VggModel, self).__init__()
        self.vgg = models.vgg16()  # vgg16模型
        del self.vgg.avgpool
        del self.vgg.classifier  # 分别去掉已有vgg16的模型中的池化层和分类器
        self.vgg_1 = models.vgg16()  # 将输入通道改为1的vgg16模型
        del self.vgg_1.avgpool
        del self.vgg_1.classifier  # 分别去掉已有vgg16的模型中的池化层和分类器
        origin_dicts = torch.load('pth/vgg16-397923af.pth')  # 预训练模型中vgg网络的参数
        model_dicts = self.vgg.state_dict()  # 自定义的去掉后面几层的网络的参数列表
        pretrained_dicts = {k: v for k, v in origin_dicts.items() if k in model_dicts}  # 预训练模型参数在自定义模型中有的参数列表
        model_dicts.update(pretrained_dicts)  # 更新自定义的模型参数
        self.vgg.load_state_dict(model_dicts)  # 加载更新后的自定义的网络模型参数
        self.vgg_1.features[0] = nn.Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))  # 将输入通道改为1
        model_dicts = self.vgg_1.state_dict()  # 自定义的去掉后面几层的网络的参数列表
        pretrained_dicts = {k: v for k, v in origin_dicts.items() if k in model_dicts}  # 预训练模型参数在自定义模型中有的参数列表
        layer1 = pretrained_dicts['features.0.weight']
        new = torch.zeros(64, 1, 3, 3)
        for i, output_channel in enumerate(layer1):
            new[i] = 0.299 * output_channel[0] + 0.587 * output_channel[1] + 0.114 * output_channel[2]
        pretrained_dicts['features.0.weight'] = new
        model_dicts.update(pretrained_dicts)  # 更新自定义的模型参数
        # print(model_dicts.keys())
        self.vgg_1.load_state_dict(model_dicts)  # 加载更新后的自定义的网络模型参数
        # print(self.vgg_1.features)

        self.use_se = use_se
        if self.use_se:
            self.vgg_se = nn.Sequential()
            for i, fea in enumerate(self.vgg.features):
                # print(i, fea)
                self.vgg_se.add_module(str(i), fea)
                if i == 16:
                    self.vgg_se.add_module('se1', SELayer(256))
                if i == 23:
                    self.vgg_se.add_module('se2', SELayer(512))
                if i == 30:
                    self.vgg_se.add_module('se3', SELayer(512))
            model_dicts_se = self.vgg_se.state_dict()
            pretrained_dicts_se = {k[9:]: v for k, v in origin_dicts.items() if k[9:] in model_dicts_se}
            model_dicts_se.update(pretrained_dicts_se)
            self.vgg_se.load_state_dict(model_dicts_se)

            self.vgg_1_se = nn.Sequential()
            for i, fea in enumerate(self.vgg_1.features):
                # print(i, fea)
                self.vgg_1_se.add_module(str(i), fea)
                if i == 16:
                    self.vgg_1_se.add_module('se1', SELayer(256))
                if i == 23:
                    self.vgg_1_se.add_module('se2', SELayer(512))
                if i == 30:
                    self.vgg_1_se.add_module('se3', SELayer(512))
            model_dicts_1_se = self.vgg_1_se.state_dict()
            pretrained_dicts_1_se = {k[9:]: v for k, v in origin_dicts.items() if k[9:] in model_dicts_1_se}
            model_dicts_1_se.update(pretrained_dicts_1_se)
            self.vgg_1_se.load_state_dict(model_dicts_1_se)

        self.conv1_fusion = nn.Conv2d(1536, 256, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(256)
        self.relu1_fusion = nn.ReLU(inplace=True)

        self.conv2_fusion = nn.Conv2d(256, 128, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2_fusion = nn.ReLU(inplace=True)

        self.downsample = nn.Sequential(
            nn.Conv2d(1536, 128, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(128),
        )
        self.conv_fusion = nn.Sequential(
            nn.Conv2d(128, 64, kernel_size=1, stride=1, padding=0, bias=False),
            nn.ReLU(inplace=True),
        )

        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(64 * 4 * 4, 512),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(512, 256),
            nn.ReLU(inplace=True),
            nn.Linear(256, num_classes),
        )

        self.use_spp = use_spp
        if use_spp:
            self.num_level = num_level
            self.pool_type = pool_type
            self.num_grid = self._cal_num_grids(num_level)
            self.spp_layer = SpatialPyramidPooling2d(num_level)

            self.classifier_spp = nn.Sequential(
                nn.Dropout(),
                nn.Linear(64 * self.num_grid, 512),
                nn.ReLU(inplace=True),
                nn.Dropout(),
                nn.Linear(512, 256),
                nn.ReLU(inplace=True),
                nn.Linear(256, num_classes),
            )
    def __init__(self,
                 num_classes=3,
                 num_level=3,
                 pool_type='max_pool',
                 use_spp=False,
                 use_se=False):
        super(VggModel, self).__init__()
        # pre = torch.load("vgg16-397923af.pth")
        # model = models.vgg16(pretrained=False)
        # model.load_state_dict(pre)
        self.features1 = nn.Sequential(
            # [16, 3, 128, 128]
            nn.Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(64,
                      64,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(64,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(128,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(128,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(256,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False))
        if use_se:
            self.features1_se = nn.Sequential(
                # [16, 3, 128, 128]
                nn.Conv2d(3,
                          64,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(64,
                          64,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                nn.Conv2d(64,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(128,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                nn.Conv2d(128,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(256,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(256,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                SELayer(256),
                nn.Conv2d(256,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                SELayer(512),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)),
                nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                SELayer(128))
        self.features2 = nn.Sequential(
            nn.Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(64,
                      64,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(64,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(128,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(128,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      256,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(256,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      512,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.Conv2d(512,
                      128,
                      kernel_size=(3, 3),
                      stride=(1, 1),
                      padding=(1, 1)), nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,
                         stride=2,
                         padding=0,
                         dilation=1,
                         ceil_mode=False))
        if use_se:
            self.features2_se = nn.Sequential(
                nn.Conv2d(1,
                          64,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(64,
                          64,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                nn.Conv2d(64,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(128,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False),
                nn.Conv2d(128,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(256,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(256,
                          256,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False), SELayer(256),
                nn.Conv2d(256,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False), SELayer(512),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          512,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.Conv2d(512,
                          128,
                          kernel_size=(3, 3),
                          stride=(1, 1),
                          padding=(1, 1)), nn.ReLU(inplace=True),
                nn.MaxPool2d(kernel_size=2,
                             stride=2,
                             padding=0,
                             dilation=1,
                             ceil_mode=False), SELayer(128))
        self.conv1_fusion = nn.Conv2d(384,
                                      256,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1,
                                      bias=False)
        self.bn1 = nn.BatchNorm2d(256)
        self.relu1_fusion = nn.ReLU(inplace=True)

        self.conv2_fusion = nn.Conv2d(256,
                                      128,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1,
                                      bias=False)
        self.bn2 = nn.BatchNorm2d(128)
        self.relu2_fusion = nn.ReLU(inplace=True)

        self.downsample = nn.Sequential(
            nn.Conv2d(384, 128, kernel_size=1, stride=1, padding=0,
                      bias=False),
            nn.BatchNorm2d(128),
        )
        self.conv_fusion = nn.Sequential(
            nn.Conv2d(128, 64, kernel_size=1, stride=1, padding=0, bias=False),
            nn.ReLU(inplace=True),
        )

        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(64 * 4 * 4, 512),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(512, 256),
            nn.ReLU(inplace=True),
            nn.Linear(256, num_classes),
        )

        self.use_spp = use_spp
        self.use_se = use_se
        if use_spp:
            self.num_level = num_level
            self.pool_type = pool_type
            self.num_grid = self._cal_num_grids(num_level)
            self.spp_layer = SpatialPyramidPooling2d(num_level)

            self.classifier_spp = nn.Sequential(
                nn.Dropout(),
                nn.Linear(64 * self.num_grid, 512),
                nn.ReLU(inplace=True),
                nn.Dropout(),
                nn.Linear(512, 256),
                nn.ReLU(inplace=True),
                nn.Linear(256, num_classes),
            )