深度学习训练camp-第J9周:Inception v3算法实战与解析

📌 本周任务:

  1. 了解并学习InceptionV3相对于InceptionV1改进了哪些地方(重点)
  2. 使用Inception v3完成天气识别案例

Inception V3与V1之间的区别:
相对于InceptionV1(即GoogLeNet),InceptionV3在网络结构和训练策略上均进行了多方面的改进,旨在提升模型的表达能力、计算效率以及泛化性能。下面就主要改进点做详细说明:

  • 卷积核因式分解(Factorization into Smaller Convolutions)

  • 大卷积核分解:InceptionV1中某些模块采用了5×5卷积,但5×5卷积不仅参数量较大,而且计算量较高。InceptionV3将5×5卷积因式分解为连续的两个3×3卷积,既保持了相同的感受野,又显著降低了参数量和计算复杂度。

  • 异构卷积分解:在进一步优化方面,InceptionV3还将3×3卷积进一步分解为1×3和3×1的两个卷积操作。这种异构分解方法能够更精细地捕捉空间信息,同时降低计算代价,提高了模型效率。

  • 批归一化(Batch Normalization)的广泛应用

  • InceptionV3在更多卷积层后引入了批归一化技术。这一改进有助于稳定各层输出的分布,加速训练收敛,并在一定程度上起到正则化作用,从而提升了模型的泛化能力。相较于InceptionV1中对批归一化的应用较为有限,V3版本在此方面更为充分,整体训练过程更为稳健。

  • 标签平滑(Label Smoothing)正则化

  • 为缓解模型过拟合问题,InceptionV3在损失函数中引入了标签平滑技术。通过对目标标签进行平滑处理,减弱模型对训练数据中噪声的过度拟合,使得输出分布更为平滑,从而提高了模型在测试集上的泛化性能。

  • 网络结构的深度与宽度调整

  • 在保持计算资源合理的前提下,InceptionV3对网络的深度和宽度进行了优化调整。通过增加层数和调整Inception模块内部的结构,模型能够学习到更丰富、更细粒度的特征表示。这种结构上的优化有助于提高模型在复杂视觉任务中的表现。

  • 辅助分类器的改进

  • InceptionV1中通过辅助分类器(Auxiliary Classifiers)来缓解梯度消失问题,并起到一定的正则化效果。InceptionV3在保留这一设计思想的同时,对辅助分类器的结构和权重分配进行了精细化调整,使其与主分类器的协同训练效果更佳,从而整体上改善了模型性能。

  • 优化器与训练技巧的改进

  • 除了网络结构的改进,InceptionV3在训练过程中也采用了更为先进的优化方法(如RMSProp)以及针对性的数据预处理和数据增强技术。这些训练技巧的改进不仅加快了模型的收敛速度,还提升了模型在不同任务和数据集上的鲁棒性。

总结:InceptionV3相对于InceptionV1的主要改进体现在以下几个方面:

  • 通过将大卷积核(如5×5)因式分解为更小的卷积核组合(例如两个3×3或1×3与3×1的组合),有效降低了模型参数量和计算复杂度,同时提升了非线性特征的表达能力;
    在更大范围内应用批归一化技术,加速训练并提高稳定性; 引入标签平滑正则化,缓解过拟合问题;
    对网络结构进行深度与宽度的优化调整,以及辅助分类器的精细设计,进一步增强了模型的表达能力和训练效果;
    综合采用先进的优化器和训练策略,提高了整体模型性能。
    这些改进措施共同作用,使得InceptionV3在准确率、效率和鲁棒性等方面均优于其前身InceptionV1,成为计算机视觉任务中更为高效和准确的深度卷积神经网络架构。

1、搭建网络

1、Inception-A

在这里插入图片描述

class InceptionA(nn.Module):

    def __init__(self, in_channels, pool_features):
        super(InceptionA, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 64, kernel_size=1) # 1

        self.branch5x5_1 = BasicConv2d(in_channels, 48, kernel_size=1)
        self.branch5x5_2 = BasicConv2d(48, 64, kernel_size=5, padding=2)

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 64, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(64, 96, kernel_size=3, padding=1)
        self.branch3x3dbl_3 = BasicConv2d(96, 96, kernel_size=3, padding=1)

        self.branch_pool = BasicConv2d(in_channels, pool_features, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch5x5 = self.branch5x5_1(x)
        branch5x5 = self.branch5x5_2(branch5x5)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch5x5, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)

2、Inception-B

在这里插入图片描述

class InceptionB(nn.Module):

    def __init__(self, in_channels, channels_7x7):
        super(InceptionB, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 192, kernel_size=1)

        c7 = channels_7x7
        self.branch7x7_1 = BasicConv2d(in_channels, c7, kernel_size=1)
        self.branch7x7_2 = BasicConv2d(c7, c7, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7_3 = BasicConv2d(c7, 192, kernel_size=(7, 1), padding=(3, 0))

        self.branch7x7dbl_1 = BasicConv2d(in_channels, c7, kernel_size=1)
        self.branch7x7dbl_2 = BasicConv2d(c7, c7, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7dbl_3 = BasicConv2d(c7, c7, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7dbl_4 = BasicConv2d(c7, c7, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7dbl_5 = BasicConv2d(c7, 192, kernel_size=(1, 7), padding=(0, 3))

        self.branch_pool = BasicConv2d(in_channels, 192, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch7x7 = self.branch7x7_1(x)
        branch7x7 = self.branch7x7_2(branch7x7)
        branch7x7 = self.branch7x7_3(branch7x7)

        branch7x7dbl = self.branch7x7dbl_1(x)
        branch7x7dbl = self.branch7x7dbl_2(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_3(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_4(branch7x7dbl)
        branch7x7dbl = self.branch7x7dbl_5(branch7x7dbl)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch7x7, branch7x7dbl, branch_pool]
        return torch.cat(outputs, 1)

3、Inception-C

在这里插入图片描述

class InceptionC(nn.Module):

    def __init__(self, in_channels):
        super(InceptionC, self).__init__()
        self.branch1x1 = BasicConv2d(in_channels, 320, kernel_size=1)

        self.branch3x3_1 = BasicConv2d(in_channels, 384, kernel_size=1)
        self.branch3x3_2a = BasicConv2d(384, 384, kernel_size=(1, 3), padding=(0, 1))
        self.branch3x3_2b = BasicConv2d(384, 384, kernel_size=(3, 1), padding=(1, 0))

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 448, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(448, 384, kernel_size=3, padding=1)
        self.branch3x3dbl_3a = BasicConv2d(384, 384, kernel_size=(1, 3), padding=(0, 1))
        self.branch3x3dbl_3b = BasicConv2d(384, 384, kernel_size=(3, 1), padding=(1, 0))

        self.branch_pool = BasicConv2d(in_channels, 192, kernel_size=1)

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch3x3 = self.branch3x3_1(x)
        branch3x3 = [
            self.branch3x3_2a(branch3x3),
            self.branch3x3_2b(branch3x3),
        ]
        branch3x3 = torch.cat(branch3x3, 1)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = [
            self.branch3x3dbl_3a(branch3x3dbl),
            self.branch3x3dbl_3b(branch3x3dbl),
        ]
        branch3x3dbl = torch.cat(branch3x3dbl, 1)

        branch_pool = F.avg_pool2d(x, kernel_size=3, stride=1, padding=1)
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch3x3, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)

4、Reduction-A

在这里插入图片描述

class ReductionA(nn.Module):

    def __init__(self, in_channels):
        super(ReductionA, self).__init__()
        self.branch3x3 = BasicConv2d(in_channels, 384, kernel_size=3, stride=2)

        self.branch3x3dbl_1 = BasicConv2d(in_channels, 64, kernel_size=1)
        self.branch3x3dbl_2 = BasicConv2d(64, 96, kernel_size=3, padding=1)
        self.branch3x3dbl_3 = BasicConv2d(96, 96, kernel_size=3, stride=2)

    def forward(self, x):
        branch3x3 = self.branch3x3(x)

        branch3x3dbl = self.branch3x3dbl_1(x)
        branch3x3dbl = self.branch3x3dbl_2(branch3x3dbl)
        branch3x3dbl = self.branch3x3dbl_3(branch3x3dbl)

        branch_pool = F.max_pool2d(x, kernel_size=3, stride=2)

        outputs = [branch3x3, branch3x3dbl, branch_pool]
        return torch.cat(outputs, 1)

5、Reduction-B

在这里插入图片描述

class ReductionB(nn.Module):

    def __init__(self, in_channels):
        super(ReductionB, self).__init__()
        self.branch3x3_1 = BasicConv2d(in_channels, 192, kernel_size=1)
        self.branch3x3_2 = BasicConv2d(192, 320, kernel_size=3, stride=2)

        self.branch7x7x3_1 = BasicConv2d(in_channels, 192, kernel_size=1)
        self.branch7x7x3_2 = BasicConv2d(192, 192, kernel_size=(1, 7), padding=(0, 3))
        self.branch7x7x3_3 = BasicConv2d(192, 192, kernel_size=(7, 1), padding=(3, 0))
        self.branch7x7x3_4 = BasicConv2d(192, 192, kernel_size=3, stride=2)

    def forward(self, x):
        branch3x3 = self.branch3x3_1(x)
        branch3x3 = self.branch3x3_2(branch3x3)

        branch7x7x3 = self.branch7x7x3_1(x)
        branch7x7x3 = self.branch7x7x3_2(branch7x7x3)
        branch7x7x3 = self.branch7x7x3_3(branch7x7x3)
        branch7x7x3 = self.branch7x7x3_4(branch7x7x3)

        branch_pool = F.max_pool2d(x, kernel_size=3, stride=2)
        outputs = [branch3x3, branch7x7x3, branch_pool]
        return torch.cat(outputs, 1)

6、辅助分支

class InceptionAux(nn.Module):

    def __init__(self, in_channels, num_classes):
        super(InceptionAux, self).__init__()
        self.conv0 = BasicConv2d(in_channels, 128, kernel_size=1)
        self.conv1 = BasicConv2d(128, 768, kernel_size=5)
        self.conv1.stddev = 0.01
        self.fc = nn.Linear(768, num_classes)
        self.fc.stddev = 0.001

    def forward(self, x):
        # 17 x 17 x 768
        x = F.avg_pool2d(x, kernel_size=5, stride=3)
        # 5 x 5 x 768
        x = self.conv0(x)
        # 5 x 5 x 128
        x = self.conv1(x)
        # 1 x 1 x 768
        x = x.view(x.size(0), -1)
        # 768
        x = self.fc(x)
        # 1000
        return x

7、模型搭建

在这里插入图片描述

class InceptionV3(nn.Module):
    def __init__(self, num_classes=1000, aux_logits=False, transform_input=False):
        super(InceptionV3, self).__init__()
        self.aux_logits = aux_logits
        self.transform_input = transform_input
        self.Conv2d_1a_3x3 = BasicConv2d(3, 32, kernel_size=3, stride=2)
        self.Conv2d_2a_3x3 = BasicConv2d(32, 32, kernel_size=3)
        self.Conv2d_2b_3x3 = BasicConv2d(32, 64, kernel_size=3, padding=1)
        self.Conv2d_3b_1x1 = BasicConv2d(64, 80, kernel_size=1)
        self.Conv2d_4a_3x3 = BasicConv2d(80, 192, kernel_size=3)
        self.Mixed_5b = InceptionA(192, pool_features=32)
        self.Mixed_5c = InceptionA(256, pool_features=64)
        self.Mixed_5d = InceptionA(288, pool_features=64)
        self.Mixed_6a = ReductionA(288)
        self.Mixed_6b = InceptionB(768, channels_7x7=128)
        self.Mixed_6c = InceptionB(768, channels_7x7=160)
        self.Mixed_6d = InceptionB(768, channels_7x7=160)
        self.Mixed_6e = InceptionB(768, channels_7x7=192)
        if aux_logits:
            self.AuxLogits = InceptionAux(768, num_classes)
        self.Mixed_7a = ReductionB(768)
        self.Mixed_7b = InceptionC(1280)
        self.Mixed_7c = InceptionC(2048)
        self.fc = nn.Linear(2048, num_classes)

    def forward(self, x):
        if self.transform_input: # 1
            x = x.clone()
            x[:, 0] = x[:, 0] * (0.229 / 0.5) + (0.485 - 0.5) / 0.5
            x[:, 1] = x[:, 1] * (0.224 / 0.5) + (0.456 - 0.5) / 0.5
            x[:, 2] = x[:, 2] * (0.225 / 0.5) + (0.406 - 0.5) / 0.5
        # 299 x 299 x 3
        x = self.Conv2d_1a_3x3(x)
        # 149 x 149 x 32
        x = self.Conv2d_2a_3x3(x)
        # 147 x 147 x 32
        x = self.Conv2d_2b_3x3(x)
        # 147 x 147 x 64
        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 73 x 73 x 64
        x = self.Conv2d_3b_1x1(x)
        # 73 x 73 x 80
        x = self.Conv2d_4a_3x3(x)
        # 71 x 71 x 192
        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 35 x 35 x 192
        x = self.Mixed_5b(x)
        # 35 x 35 x 256
        x = self.Mixed_5c(x)
        # 35 x 35 x 288
        x = self.Mixed_5d(x)
        # 35 x 35 x 288
        x = self.Mixed_6a(x)
        # 17 x 17 x 768
        x = self.Mixed_6b(x)
        # 17 x 17 x 768
        x = self.Mixed_6c(x)
        # 17 x 17 x 768
        x = self.Mixed_6d(x)
        # 17 x 17 x 768
        x = self.Mixed_6e(x)
        # 17 x 17 x 768
        if self.training and self.aux_logits:
            aux = self.AuxLogits(x)
        # 17 x 17 x 768
        x = self.Mixed_7a(x)
        # 8 x 8 x 1280
        x = self.Mixed_7b(x)
        # 8 x 8 x 2048
        x = self.Mixed_7c(x)
        # 8 x 8 x 2048
        x = F.avg_pool2d(x, kernel_size=8)
        # 1 x 1 x 2048
        x = F.dropout(x, training=self.training)
        # 1 x 1 x 2048
        x = x.view(x.size(0), -1)
        # 2048
        x = self.fc(x)
        # 1000 (num_classes)
        if self.training and self.aux_logits:
            return x, aux
        return x

2、网络总结

device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))
    
model = InceptionV3().to(device)
model

代码输出:

Using cuda device

InceptionV3(
  (Conv2d_1a_3x3): BasicConv2d(
    (conv): Conv2d(3, 32, kernel_size=(3, 3), stride=(2, 2), bias=False)
    (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (Conv2d_2a_3x3): BasicConv2d(
    (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (Conv2d_2b_3x3): BasicConv2d(
    (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
    (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (Conv2d_3b_1x1): BasicConv2d(
    (conv): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(80, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (Conv2d_4a_3x3): BasicConv2d(
    (conv): Conv2d(80, 192, kernel_size=(3, 3), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
  )
  (Mixed_5b): InceptionA(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_1): BasicConv2d(
      (conv): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_2): BasicConv2d(
      (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(192, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3): BasicConv2d(
      (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(192, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(32, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_5c): InceptionA(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_1): BasicConv2d(
      (conv): Conv2d(256, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_2): BasicConv2d(
      (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3): BasicConv2d(
      (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_5d): InceptionA(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_1): BasicConv2d(
      (conv): Conv2d(288, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(48, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch5x5_2): BasicConv2d(
      (conv): Conv2d(48, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3): BasicConv2d(
      (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_6a): ReductionA(
    (branch3x3): BasicConv2d(
      (conv): Conv2d(288, 384, kernel_size=(3, 3), stride=(2, 2), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(288, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(64, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(64, 96, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3): BasicConv2d(
      (conv): Conv2d(96, 96, kernel_size=(3, 3), stride=(2, 2), bias=False)
      (bn): BatchNorm2d(96, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_6b): InceptionB(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_1): BasicConv2d(
      (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_2): BasicConv2d(
      (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_3): BasicConv2d(
      (conv): Conv2d(128, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_1): BasicConv2d(
      (conv): Conv2d(768, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_2): BasicConv2d(
      (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_3): BasicConv2d(
      (conv): Conv2d(128, 128, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_4): BasicConv2d(
      (conv): Conv2d(128, 128, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(128, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_5): BasicConv2d(
      (conv): Conv2d(128, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_6c): InceptionB(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_1): BasicConv2d(
      (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_2): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_3): BasicConv2d(
      (conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_1): BasicConv2d(
      (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_2): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_3): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_4): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_5): BasicConv2d(
      (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_6d): InceptionB(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_1): BasicConv2d(
      (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_2): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_3): BasicConv2d(
      (conv): Conv2d(160, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_1): BasicConv2d(
      (conv): Conv2d(768, 160, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_2): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_3): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_4): BasicConv2d(
      (conv): Conv2d(160, 160, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(160, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_5): BasicConv2d(
      (conv): Conv2d(160, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_6e): InceptionB(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_2): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7_3): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_2): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_3): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_4): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7dbl_5): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_7a): ReductionB(
    (branch3x3_1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_2): BasicConv2d(
      (conv): Conv2d(192, 320, kernel_size=(3, 3), stride=(2, 2), bias=False)
      (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7x3_1): BasicConv2d(
      (conv): Conv2d(768, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7x3_2): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(1, 7), stride=(1, 1), padding=(0, 3), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7x3_3): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(7, 1), stride=(1, 1), padding=(3, 0), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch7x7x3_4): BasicConv2d(
      (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(2, 2), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_7b): InceptionC(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(1280, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_1): BasicConv2d(
      (conv): Conv2d(1280, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_2a): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_2b): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(1280, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3a): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3b): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(1280, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (Mixed_7c): InceptionC(
    (branch1x1): BasicConv2d(
      (conv): Conv2d(2048, 320, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(320, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_1): BasicConv2d(
      (conv): Conv2d(2048, 384, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_2a): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3_2b): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_1): BasicConv2d(
      (conv): Conv2d(2048, 448, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(448, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_2): BasicConv2d(
      (conv): Conv2d(448, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3a): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(1, 3), stride=(1, 1), padding=(0, 1), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch3x3dbl_3b): BasicConv2d(
      (conv): Conv2d(384, 384, kernel_size=(3, 1), stride=(1, 1), padding=(1, 0), bias=False)
      (bn): BatchNorm2d(384, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
    (branch_pool): BasicConv2d(
      (conv): Conv2d(2048, 192, kernel_size=(1, 1), stride=(1, 1), bias=False)
      (bn): BatchNorm2d(192, eps=0.001, momentum=0.1, affine=True, track_running_stats=True)
    )
  )
  (fc): Linear(in_features=2048, out_features=1000, bias=True)
)
import torchsummary as summary
summary.summary(model, (3, 299, 299))

代码输出:

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 32, 149, 149]             864
       BatchNorm2d-2         [-1, 32, 149, 149]              64
       BasicConv2d-3         [-1, 32, 149, 149]               0
            Conv2d-4         [-1, 32, 147, 147]           9,216
       BatchNorm2d-5         [-1, 32, 147, 147]              64
       BasicConv2d-6         [-1, 32, 147, 147]               0
            Conv2d-7         [-1, 64, 147, 147]          18,432
       BatchNorm2d-8         [-1, 64, 147, 147]             128
       BasicConv2d-9         [-1, 64, 147, 147]               0
           Conv2d-10           [-1, 80, 73, 73]           5,120
      BatchNorm2d-11           [-1, 80, 73, 73]             160
      BasicConv2d-12           [-1, 80, 73, 73]               0
           Conv2d-13          [-1, 192, 71, 71]         138,240
      BatchNorm2d-14          [-1, 192, 71, 71]             384
      BasicConv2d-15          [-1, 192, 71, 71]               0
           Conv2d-16           [-1, 64, 35, 35]          12,288
      BatchNorm2d-17           [-1, 64, 35, 35]             128
      BasicConv2d-18           [-1, 64, 35, 35]               0
           Conv2d-19           [-1, 48, 35, 35]           9,216
      BatchNorm2d-20           [-1, 48, 35, 35]              96
      BasicConv2d-21           [-1, 48, 35, 35]               0
           Conv2d-22           [-1, 64, 35, 35]          76,800
      BatchNorm2d-23           [-1, 64, 35, 35]             128
      BasicConv2d-24           [-1, 64, 35, 35]               0
           Conv2d-25           [-1, 64, 35, 35]          12,288
      BatchNorm2d-26           [-1, 64, 35, 35]             128
      BasicConv2d-27           [-1, 64, 35, 35]               0
           Conv2d-28           [-1, 96, 35, 35]          55,296
      BatchNorm2d-29           [-1, 96, 35, 35]             192
      BasicConv2d-30           [-1, 96, 35, 35]               0
           Conv2d-31           [-1, 96, 35, 35]          82,944
      BatchNorm2d-32           [-1, 96, 35, 35]             192
      BasicConv2d-33           [-1, 96, 35, 35]               0
           Conv2d-34           [-1, 32, 35, 35]           6,144
      BatchNorm2d-35           [-1, 32, 35, 35]              64
      BasicConv2d-36           [-1, 32, 35, 35]               0
       InceptionA-37          [-1, 256, 35, 35]               0
           Conv2d-38           [-1, 64, 35, 35]          16,384
      BatchNorm2d-39           [-1, 64, 35, 35]             128
      BasicConv2d-40           [-1, 64, 35, 35]               0
           Conv2d-41           [-1, 48, 35, 35]          12,288
      BatchNorm2d-42           [-1, 48, 35, 35]              96
      BasicConv2d-43           [-1, 48, 35, 35]               0
           Conv2d-44           [-1, 64, 35, 35]          76,800
      BatchNorm2d-45           [-1, 64, 35, 35]             128
      BasicConv2d-46           [-1, 64, 35, 35]               0
           Conv2d-47           [-1, 64, 35, 35]          16,384
      BatchNorm2d-48           [-1, 64, 35, 35]             128
      BasicConv2d-49           [-1, 64, 35, 35]               0
           Conv2d-50           [-1, 96, 35, 35]          55,296
      BatchNorm2d-51           [-1, 96, 35, 35]             192
      BasicConv2d-52           [-1, 96, 35, 35]               0
           Conv2d-53           [-1, 96, 35, 35]          82,944
      BatchNorm2d-54           [-1, 96, 35, 35]             192
      BasicConv2d-55           [-1, 96, 35, 35]               0
           Conv2d-56           [-1, 64, 35, 35]          16,384
      BatchNorm2d-57           [-1, 64, 35, 35]             128
      BasicConv2d-58           [-1, 64, 35, 35]               0
       InceptionA-59          [-1, 288, 35, 35]               0
           Conv2d-60           [-1, 64, 35, 35]          18,432
      BatchNorm2d-61           [-1, 64, 35, 35]             128
      BasicConv2d-62           [-1, 64, 35, 35]               0
           Conv2d-63           [-1, 48, 35, 35]          13,824
      BatchNorm2d-64           [-1, 48, 35, 35]              96
      BasicConv2d-65           [-1, 48, 35, 35]               0
           Conv2d-66           [-1, 64, 35, 35]          76,800
      BatchNorm2d-67           [-1, 64, 35, 35]             128
      BasicConv2d-68           [-1, 64, 35, 35]               0
           Conv2d-69           [-1, 64, 35, 35]          18,432
      BatchNorm2d-70           [-1, 64, 35, 35]             128
      BasicConv2d-71           [-1, 64, 35, 35]               0
           Conv2d-72           [-1, 96, 35, 35]          55,296
      BatchNorm2d-73           [-1, 96, 35, 35]             192
      BasicConv2d-74           [-1, 96, 35, 35]               0
           Conv2d-75           [-1, 96, 35, 35]          82,944
      BatchNorm2d-76           [-1, 96, 35, 35]             192
      BasicConv2d-77           [-1, 96, 35, 35]               0
           Conv2d-78           [-1, 64, 35, 35]          18,432
      BatchNorm2d-79           [-1, 64, 35, 35]             128
      BasicConv2d-80           [-1, 64, 35, 35]               0
       InceptionA-81          [-1, 288, 35, 35]               0
           Conv2d-82          [-1, 384, 17, 17]         995,328
      BatchNorm2d-83          [-1, 384, 17, 17]             768
      BasicConv2d-84          [-1, 384, 17, 17]               0
           Conv2d-85           [-1, 64, 35, 35]          18,432
      BatchNorm2d-86           [-1, 64, 35, 35]             128
      BasicConv2d-87           [-1, 64, 35, 35]               0
           Conv2d-88           [-1, 96, 35, 35]          55,296
      BatchNorm2d-89           [-1, 96, 35, 35]             192
      BasicConv2d-90           [-1, 96, 35, 35]               0
           Conv2d-91           [-1, 96, 17, 17]          82,944
      BatchNorm2d-92           [-1, 96, 17, 17]             192
      BasicConv2d-93           [-1, 96, 17, 17]               0
       ReductionA-94          [-1, 768, 17, 17]               0
           Conv2d-95          [-1, 192, 17, 17]         147,456
      BatchNorm2d-96          [-1, 192, 17, 17]             384
      BasicConv2d-97          [-1, 192, 17, 17]               0
           Conv2d-98          [-1, 128, 17, 17]          98,304
      BatchNorm2d-99          [-1, 128, 17, 17]             256
     BasicConv2d-100          [-1, 128, 17, 17]               0
          Conv2d-101          [-1, 128, 17, 17]         114,688
     BatchNorm2d-102          [-1, 128, 17, 17]             256
     BasicConv2d-103          [-1, 128, 17, 17]               0
          Conv2d-104          [-1, 192, 17, 17]         172,032
     BatchNorm2d-105          [-1, 192, 17, 17]             384
     BasicConv2d-106          [-1, 192, 17, 17]               0
          Conv2d-107          [-1, 128, 17, 17]          98,304
     BatchNorm2d-108          [-1, 128, 17, 17]             256
     BasicConv2d-109          [-1, 128, 17, 17]               0
          Conv2d-110          [-1, 128, 17, 17]         114,688
     BatchNorm2d-111          [-1, 128, 17, 17]             256
     BasicConv2d-112          [-1, 128, 17, 17]               0
          Conv2d-113          [-1, 128, 17, 17]         114,688
     BatchNorm2d-114          [-1, 128, 17, 17]             256
     BasicConv2d-115          [-1, 128, 17, 17]               0
          Conv2d-116          [-1, 128, 17, 17]         114,688
     BatchNorm2d-117          [-1, 128, 17, 17]             256
     BasicConv2d-118          [-1, 128, 17, 17]               0
          Conv2d-119          [-1, 192, 17, 17]         172,032
     BatchNorm2d-120          [-1, 192, 17, 17]             384
     BasicConv2d-121          [-1, 192, 17, 17]               0
          Conv2d-122          [-1, 192, 17, 17]         147,456
     BatchNorm2d-123          [-1, 192, 17, 17]             384
     BasicConv2d-124          [-1, 192, 17, 17]               0
      InceptionB-125          [-1, 768, 17, 17]               0
          Conv2d-126          [-1, 192, 17, 17]         147,456
     BatchNorm2d-127          [-1, 192, 17, 17]             384
     BasicConv2d-128          [-1, 192, 17, 17]               0
          Conv2d-129          [-1, 160, 17, 17]         122,880
     BatchNorm2d-130          [-1, 160, 17, 17]             320
     BasicConv2d-131          [-1, 160, 17, 17]               0
          Conv2d-132          [-1, 160, 17, 17]         179,200
     BatchNorm2d-133          [-1, 160, 17, 17]             320
     BasicConv2d-134          [-1, 160, 17, 17]               0
          Conv2d-135          [-1, 192, 17, 17]         215,040
     BatchNorm2d-136          [-1, 192, 17, 17]             384
     BasicConv2d-137          [-1, 192, 17, 17]               0
          Conv2d-138          [-1, 160, 17, 17]         122,880
     BatchNorm2d-139          [-1, 160, 17, 17]             320
     BasicConv2d-140          [-1, 160, 17, 17]               0
          Conv2d-141          [-1, 160, 17, 17]         179,200
     BatchNorm2d-142          [-1, 160, 17, 17]             320
     BasicConv2d-143          [-1, 160, 17, 17]               0
          Conv2d-144          [-1, 160, 17, 17]         179,200
     BatchNorm2d-145          [-1, 160, 17, 17]             320
     BasicConv2d-146          [-1, 160, 17, 17]               0
          Conv2d-147          [-1, 160, 17, 17]         179,200
     BatchNorm2d-148          [-1, 160, 17, 17]             320
     BasicConv2d-149          [-1, 160, 17, 17]               0
          Conv2d-150          [-1, 192, 17, 17]         215,040
     BatchNorm2d-151          [-1, 192, 17, 17]             384
     BasicConv2d-152          [-1, 192, 17, 17]               0
          Conv2d-153          [-1, 192, 17, 17]         147,456
     BatchNorm2d-154          [-1, 192, 17, 17]             384
     BasicConv2d-155          [-1, 192, 17, 17]               0
      InceptionB-156          [-1, 768, 17, 17]               0
          Conv2d-157          [-1, 192, 17, 17]         147,456
     BatchNorm2d-158          [-1, 192, 17, 17]             384
     BasicConv2d-159          [-1, 192, 17, 17]               0
          Conv2d-160          [-1, 160, 17, 17]         122,880
     BatchNorm2d-161          [-1, 160, 17, 17]             320
     BasicConv2d-162          [-1, 160, 17, 17]               0
          Conv2d-163          [-1, 160, 17, 17]         179,200
     BatchNorm2d-164          [-1, 160, 17, 17]             320
     BasicConv2d-165          [-1, 160, 17, 17]               0
          Conv2d-166          [-1, 192, 17, 17]         215,040
     BatchNorm2d-167          [-1, 192, 17, 17]             384
     BasicConv2d-168          [-1, 192, 17, 17]               0
          Conv2d-169          [-1, 160, 17, 17]         122,880
     BatchNorm2d-170          [-1, 160, 17, 17]             320
     BasicConv2d-171          [-1, 160, 17, 17]               0
          Conv2d-172          [-1, 160, 17, 17]         179,200
     BatchNorm2d-173          [-1, 160, 17, 17]             320
     BasicConv2d-174          [-1, 160, 17, 17]               0
          Conv2d-175          [-1, 160, 17, 17]         179,200
     BatchNorm2d-176          [-1, 160, 17, 17]             320
     BasicConv2d-177          [-1, 160, 17, 17]               0
          Conv2d-178          [-1, 160, 17, 17]         179,200
     BatchNorm2d-179          [-1, 160, 17, 17]             320
     BasicConv2d-180          [-1, 160, 17, 17]               0
          Conv2d-181          [-1, 192, 17, 17]         215,040
     BatchNorm2d-182          [-1, 192, 17, 17]             384
     BasicConv2d-183          [-1, 192, 17, 17]               0
          Conv2d-184          [-1, 192, 17, 17]         147,456
     BatchNorm2d-185          [-1, 192, 17, 17]             384
     BasicConv2d-186          [-1, 192, 17, 17]               0
      InceptionB-187          [-1, 768, 17, 17]               0
          Conv2d-188          [-1, 192, 17, 17]         147,456
     BatchNorm2d-189          [-1, 192, 17, 17]             384
     BasicConv2d-190          [-1, 192, 17, 17]               0
          Conv2d-191          [-1, 192, 17, 17]         147,456
     BatchNorm2d-192          [-1, 192, 17, 17]             384
     BasicConv2d-193          [-1, 192, 17, 17]               0
          Conv2d-194          [-1, 192, 17, 17]         258,048
     BatchNorm2d-195          [-1, 192, 17, 17]             384
     BasicConv2d-196          [-1, 192, 17, 17]               0
          Conv2d-197          [-1, 192, 17, 17]         258,048
     BatchNorm2d-198          [-1, 192, 17, 17]             384
     BasicConv2d-199          [-1, 192, 17, 17]               0
          Conv2d-200          [-1, 192, 17, 17]         147,456
     BatchNorm2d-201          [-1, 192, 17, 17]             384
     BasicConv2d-202          [-1, 192, 17, 17]               0
          Conv2d-203          [-1, 192, 17, 17]         258,048
     BatchNorm2d-204          [-1, 192, 17, 17]             384
     BasicConv2d-205          [-1, 192, 17, 17]               0
          Conv2d-206          [-1, 192, 17, 17]         258,048
     BatchNorm2d-207          [-1, 192, 17, 17]             384
     BasicConv2d-208          [-1, 192, 17, 17]               0
          Conv2d-209          [-1, 192, 17, 17]         258,048
     BatchNorm2d-210          [-1, 192, 17, 17]             384
     BasicConv2d-211          [-1, 192, 17, 17]               0
          Conv2d-212          [-1, 192, 17, 17]         258,048
     BatchNorm2d-213          [-1, 192, 17, 17]             384
     BasicConv2d-214          [-1, 192, 17, 17]               0
          Conv2d-215          [-1, 192, 17, 17]         147,456
     BatchNorm2d-216          [-1, 192, 17, 17]             384
     BasicConv2d-217          [-1, 192, 17, 17]               0
      InceptionB-218          [-1, 768, 17, 17]               0
          Conv2d-219          [-1, 192, 17, 17]         147,456
     BatchNorm2d-220          [-1, 192, 17, 17]             384
     BasicConv2d-221          [-1, 192, 17, 17]               0
          Conv2d-222            [-1, 320, 8, 8]         552,960
     BatchNorm2d-223            [-1, 320, 8, 8]             640
     BasicConv2d-224            [-1, 320, 8, 8]               0
          Conv2d-225          [-1, 192, 17, 17]         147,456
     BatchNorm2d-226          [-1, 192, 17, 17]             384
     BasicConv2d-227          [-1, 192, 17, 17]               0
          Conv2d-228          [-1, 192, 17, 17]         258,048
     BatchNorm2d-229          [-1, 192, 17, 17]             384
     BasicConv2d-230          [-1, 192, 17, 17]               0
          Conv2d-231          [-1, 192, 17, 17]         258,048
     BatchNorm2d-232          [-1, 192, 17, 17]             384
     BasicConv2d-233          [-1, 192, 17, 17]               0
          Conv2d-234            [-1, 192, 8, 8]         331,776
     BatchNorm2d-235            [-1, 192, 8, 8]             384
     BasicConv2d-236            [-1, 192, 8, 8]               0
      ReductionB-237           [-1, 1280, 8, 8]               0
          Conv2d-238            [-1, 320, 8, 8]         409,600
     BatchNorm2d-239            [-1, 320, 8, 8]             640
     BasicConv2d-240            [-1, 320, 8, 8]               0
          Conv2d-241            [-1, 384, 8, 8]         491,520
     BatchNorm2d-242            [-1, 384, 8, 8]             768
     BasicConv2d-243            [-1, 384, 8, 8]               0
          Conv2d-244            [-1, 384, 8, 8]         442,368
     BatchNorm2d-245            [-1, 384, 8, 8]             768
     BasicConv2d-246            [-1, 384, 8, 8]               0
          Conv2d-247            [-1, 384, 8, 8]         442,368
     BatchNorm2d-248            [-1, 384, 8, 8]             768
     BasicConv2d-249            [-1, 384, 8, 8]               0
          Conv2d-250            [-1, 448, 8, 8]         573,440
     BatchNorm2d-251            [-1, 448, 8, 8]             896
     BasicConv2d-252            [-1, 448, 8, 8]               0
          Conv2d-253            [-1, 384, 8, 8]       1,548,288
     BatchNorm2d-254            [-1, 384, 8, 8]             768
     BasicConv2d-255            [-1, 384, 8, 8]               0
          Conv2d-256            [-1, 384, 8, 8]         442,368
     BatchNorm2d-257            [-1, 384, 8, 8]             768
     BasicConv2d-258            [-1, 384, 8, 8]               0
          Conv2d-259            [-1, 384, 8, 8]         442,368
     BatchNorm2d-260            [-1, 384, 8, 8]             768
     BasicConv2d-261            [-1, 384, 8, 8]               0
          Conv2d-262            [-1, 192, 8, 8]         245,760
     BatchNorm2d-263            [-1, 192, 8, 8]             384
     BasicConv2d-264            [-1, 192, 8, 8]               0
      InceptionC-265           [-1, 2048, 8, 8]               0
          Conv2d-266            [-1, 320, 8, 8]         655,360
     BatchNorm2d-267            [-1, 320, 8, 8]             640
     BasicConv2d-268            [-1, 320, 8, 8]               0
          Conv2d-269            [-1, 384, 8, 8]         786,432
     BatchNorm2d-270            [-1, 384, 8, 8]             768
     BasicConv2d-271            [-1, 384, 8, 8]               0
          Conv2d-272            [-1, 384, 8, 8]         442,368
     BatchNorm2d-273            [-1, 384, 8, 8]             768
     BasicConv2d-274            [-1, 384, 8, 8]               0
          Conv2d-275            [-1, 384, 8, 8]         442,368
     BatchNorm2d-276            [-1, 384, 8, 8]             768
     BasicConv2d-277            [-1, 384, 8, 8]               0
          Conv2d-278            [-1, 448, 8, 8]         917,504
     BatchNorm2d-279            [-1, 448, 8, 8]             896
     BasicConv2d-280            [-1, 448, 8, 8]               0
          Conv2d-281            [-1, 384, 8, 8]       1,548,288
     BatchNorm2d-282            [-1, 384, 8, 8]             768
     BasicConv2d-283            [-1, 384, 8, 8]               0
          Conv2d-284            [-1, 384, 8, 8]         442,368
     BatchNorm2d-285            [-1, 384, 8, 8]             768
     BasicConv2d-286            [-1, 384, 8, 8]               0
          Conv2d-287            [-1, 384, 8, 8]         442,368
     BatchNorm2d-288            [-1, 384, 8, 8]             768
     BasicConv2d-289            [-1, 384, 8, 8]               0
          Conv2d-290            [-1, 192, 8, 8]         393,216
     BatchNorm2d-291            [-1, 192, 8, 8]             384
     BasicConv2d-292            [-1, 192, 8, 8]               0
      InceptionC-293           [-1, 2048, 8, 8]               0
          Linear-294                 [-1, 1000]       2,049,000
================================================================
Total params: 23,834,568
Trainable params: 23,834,568
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 1.02
Forward/backward pass size (MB): 224.12
Params size (MB): 90.92
Estimated Total Size (MB): 316.07
----------------------------------------------------------------

3、用于天气预测

数据预处理部分每次都差不多了,我们这次省略。直接给出训练函数和测试函数以及训练过程。

import torch
import torch.nn as nn
import torch.nn.functional as F
import copy
from torch.optim.lr_scheduler import ReduceLROnPlateau

def train(dataloader, model, loss_fn, optimizer):
    model.train()  # 进入训练模式
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    
    total_loss = 0.0
    correct = 0
    
    for x, y in dataloader:
        x, y = x.to(device), y.to(device)
        
        optimizer.zero_grad()
        outputs = model(x)
        # 判断是否存在辅助分类器输出
        if isinstance(outputs, tuple):
            pred, aux = outputs
            main_loss = loss_fn(pred, y)
            aux_loss = loss_fn(aux, y)
            loss = main_loss + 0.6 * aux_loss
        else:
            pred = outputs
            loss = loss_fn(pred, y)
            
        loss.backward()
        optimizer.step()
        
        total_loss += loss.item()
        correct += (pred.argmax(dim=1) == y).type(torch.float).sum().item()
    
    avg_loss = total_loss / num_batches
    accuracy = correct / size
    return accuracy, avg_loss

def test(dataloader, model, loss_fn):
    model.eval()  # 进入评估模式
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    
    total_loss = 0.0
    correct = 0
    
    with torch.no_grad():
        for x, y in dataloader:
            x, y = x.to(device), y.to(device)
            outputs = model(x)
            # 若返回元组,则取主输出部分
            if isinstance(outputs, tuple):
                pred = outputs[0]
            else:
                pred = outputs
                
            loss = loss_fn(pred, y)
            total_loss += loss.item()
            correct += (pred.argmax(dim=1) == y).type(torch.float).sum().item()
    
    avg_loss = total_loss / num_batches
    accuracy = correct / size
    return accuracy, avg_loss


optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)
loss_fn = nn.CrossEntropyLoss()

epochs = 32

# 用于记录每个 epoch 的损失和准确率
train_loss_list = []
train_acc_list = []
test_loss_list = []
test_acc_list = []

best_acc = 0.0

for epoch in range(epochs):
    # 训练阶段
    train_acc, train_loss = train(train_dl, model, loss_fn, optimizer)
    
    # 测试阶段
    test_acc, test_loss = test(test_dl, model, loss_fn)
    
    # 根据测试损失调整学习率
    scheduler.step(test_loss)
    
    # 保存最佳模型
    if test_acc > best_acc:
        best_acc = test_acc
        best_model = copy.deepcopy(model)
    
    train_acc_list.append(train_acc)
    train_loss_list.append(train_loss)
    test_acc_list.append(test_acc)
    test_loss_list.append(test_loss)
    
    # 获取当前学习率
    current_lr = optimizer.param_groups[0]['lr']
    print(f"Epoch:{epoch+1:2d}, Train_acc:{train_acc*100:.1f}%, Train_loss:{train_loss:.3f}, "
          f"Test_acc:{test_acc*100:.1f}%, Test_loss:{test_loss:.3f}, Lr:{current_lr:.2E}")

# 保存最佳模型
PATH = './best_model.pth'
torch.save(best_model.state_dict(), PATH)

print('Training Completed. Best Test Accuracy: {:.1f}%'.format(best_acc * 100))

代码输出:

Epoch: 1, Train_acc:67.0%, Train_loss:2.894, Test_acc:30.2%, Test_loss:6.561, Lr:1.00E-04
Epoch: 2, Train_acc:86.5%, Train_loss:0.577, Test_acc:90.6%, Test_loss:0.541, Lr:1.00E-04
Epoch: 3, Train_acc:89.1%, Train_loss:0.412, Test_acc:87.6%, Test_loss:0.610, Lr:1.00E-04
Epoch: 4, Train_acc:89.5%, Train_loss:0.393, Test_acc:86.1%, Test_loss:0.519, Lr:1.00E-04
Epoch: 5, Train_acc:92.0%, Train_loss:0.320, Test_acc:90.6%, Test_loss:0.481, Lr:1.00E-04
Epoch: 6, Train_acc:93.3%, Train_loss:0.208, Test_acc:92.1%, Test_loss:0.359, Lr:1.00E-04
Epoch: 7, Train_acc:94.2%, Train_loss:0.156, Test_acc:94.6%, Test_loss:0.230, Lr:1.00E-04
Epoch: 8, Train_acc:94.3%, Train_loss:0.167, Test_acc:90.6%, Test_loss:0.350, Lr:1.00E-04
Epoch: 9, Train_acc:95.6%, Train_loss:0.150, Test_acc:92.6%, Test_loss:0.287, Lr:1.00E-04
Epoch:10, Train_acc:93.6%, Train_loss:0.152, Test_acc:93.1%, Test_loss:0.248, Lr:1.00E-04
Epoch:11, Train_acc:95.0%, Train_loss:0.155, Test_acc:94.6%, Test_loss:0.187, Lr:1.00E-04
Epoch:12, Train_acc:94.5%, Train_loss:0.171, Test_acc:92.1%, Test_loss:0.307, Lr:1.00E-04
Epoch:13, Train_acc:97.3%, Train_loss:0.088, Test_acc:91.1%, Test_loss:0.410, Lr:1.00E-04
Epoch:14, Train_acc:94.8%, Train_loss:0.126, Test_acc:92.1%, Test_loss:0.277, Lr:1.00E-04
Epoch:15, Train_acc:95.4%, Train_loss:0.157, Test_acc:90.6%, Test_loss:0.283, Lr:1.00E-04
Epoch:16, Train_acc:95.3%, Train_loss:0.124, Test_acc:96.5%, Test_loss:0.234, Lr:1.00E-04
Epoch:17, Train_acc:99.0%, Train_loss:0.050, Test_acc:95.0%, Test_loss:0.166, Lr:1.00E-04
Epoch:18, Train_acc:98.6%, Train_loss:0.052, Test_acc:94.1%, Test_loss:0.213, Lr:1.00E-04
Epoch:19, Train_acc:98.5%, Train_loss:0.053, Test_acc:93.6%, Test_loss:0.210, Lr:1.00E-04
Epoch:20, Train_acc:97.3%, Train_loss:0.093, Test_acc:96.5%, Test_loss:0.183, Lr:1.00E-04
Epoch:21, Train_acc:98.3%, Train_loss:0.051, Test_acc:94.6%, Test_loss:0.184, Lr:1.00E-04
Epoch:22, Train_acc:98.3%, Train_loss:0.052, Test_acc:94.1%, Test_loss:0.199, Lr:1.00E-04
Epoch:23, Train_acc:98.5%, Train_loss:0.067, Test_acc:95.5%, Test_loss:0.325, Lr:1.00E-05
Epoch:24, Train_acc:97.6%, Train_loss:0.071, Test_acc:96.5%, Test_loss:0.265, Lr:1.00E-05
Epoch:25, Train_acc:99.5%, Train_loss:0.016, Test_acc:96.0%, Test_loss:0.287, Lr:1.00E-05
Epoch:26, Train_acc:99.5%, Train_loss:0.023, Test_acc:96.5%, Test_loss:0.201, Lr:1.00E-05
Epoch:27, Train_acc:99.2%, Train_loss:0.021, Test_acc:96.5%, Test_loss:0.254, Lr:1.00E-05
Epoch:28, Train_acc:100.0%, Train_loss:0.011, Test_acc:96.5%, Test_loss:0.178, Lr:1.00E-05
Epoch:29, Train_acc:99.4%, Train_loss:0.017, Test_acc:96.5%, Test_loss:0.171, Lr:1.00E-06
Epoch:30, Train_acc:99.4%, Train_loss:0.023, Test_acc:96.0%, Test_loss:0.173, Lr:1.00E-06
Epoch:31, Train_acc:99.5%, Train_loss:0.050, Test_acc:96.5%, Test_loss:0.190, Lr:1.00E-06
Epoch:32, Train_acc:99.7%, Train_loss:0.017, Test_acc:96.5%, Test_loss:0.178, Lr:1.00E-06
Training Completed. Best Test Accuracy: 96.5%

4、数据可视化

import matplotlib.pyplot as plt
epochs_range = range(epochs)

plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, train_acc_list, label='Training Accuracy')
plt.plot(epochs_range, test_acc_list, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss_list, label='Training Loss')
plt.plot(epochs_range, test_loss_list, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

代码输出:
在这里插入图片描述

5、验证集准确性:

def validate(dataloader, model):
    model.eval()
    size = len(dataloader.dataset)
    num_batches = len(dataloader)

    validate_acc = 0

    for x, y in dataloader:
        x, y = x.to(device), y.to(device)

        pred = model(x)

        validate_acc += (pred.argmax(1) == y).type(torch.float).sum().item()

    validate_acc /= size

    return validate_acc


# 计算验证集准确率
validate_acc = validate(validate_dl, best_model)
print(f"Validation Accuracy: {validate_acc:.2%}")
Validation Accuracy: 94.12%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值