- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
📌 本周任务:
- 了解并学习InceptionV3相对于InceptionV1改进了哪些地方(重点)
- 使用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%

3100

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



