动手学深度学习(Pytorch版)代码实践 -卷积神经网络-27含并行连结的网络GoogLeNet

27含并行连结的网络GoogLeNet


python 复制代码
import torch
from torch import nn
from torch.nn import functional as F
import liliPytorch as lp
import matplotlib.pyplot as plt

class Inception(nn.Module):
    # c1--c4是每条路径的输出通道数
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):
        super().__init__()
        # super(Inception, self).__init__(**kwargs)
        # 线路1,单1x1卷积层
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        # 线路2,1x1卷积层后接3x3卷积层
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        # 线路3,1x1卷积层后接5x5卷积层
        self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
        self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
        # 线路4,3x3最大汇聚层后接1x1卷积层
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)

    def forward(self, x):
        # 经过每条路径,并应用 ReLU 激活函数
        p1 = F.relu(self.p1_1(x))
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        # 在通道维度上连结输出
        return torch.cat((p1, p2, p3, p4), dim=1)

# 定义模型的各个模块
b1 = nn.Sequential(
    nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3), # 第一个卷积层
    nn.ReLU(),                                            # 激活函数
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1)      # 最大汇聚层
)

b2 = nn.Sequential(
    nn.Conv2d(64, 64, kernel_size=1),                     # 1x1卷积层
    nn.ReLU(),                                            # 激活函数
    nn.Conv2d(64, 192, kernel_size=3, padding=1),         # 3x3卷积层
    nn.ReLU(),                                            # 激活函数
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1)      # 最大汇聚层
)

b3 = nn.Sequential(
    Inception(192, 64, (96, 128), (16, 32), 32),          # 第一个Inception块
    Inception(256, 128, (128, 192), (32, 96), 64),        # 第二个Inception块
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1)      # 最大汇聚层
)

b4 = nn.Sequential(
    Inception(480, 192, (96, 208), (16, 48), 64),         # 第一个Inception块
    Inception(512, 160, (112, 224), (24, 64), 64),        # 第二个Inception块
    Inception(512, 128, (128, 256), (24, 64), 64),        # 第三个Inception块
    Inception(512, 112, (144, 288), (32, 64), 64),        # 第四个Inception块
    Inception(528, 256, (160, 320), (32, 128), 128),      # 第五个Inception块
    nn.MaxPool2d(kernel_size=3, stride=2, padding=1)      # 最大汇聚层
)

b5 = nn.Sequential(
    Inception(832, 256, (160, 320), (32, 128), 128),      # 第一个Inception块
    Inception(832, 384, (192, 384), (48, 128), 128),      # 第二个Inception块
    nn.AdaptiveAvgPool2d((1, 1)),                         # 自适应平均汇聚层
    nn.Flatten()                                          # 展平层
)

# 将所有模块串联成一个完整的模型
net = nn.Sequential(
    b1,      # 第一模块
    b2,      # 第二模块
    b3,      # 第三模块
    b4,      # 第四模块
    b5,      # 第五模块
    nn.Linear(1024, 10)  # 最后一层全连接层,输出10个类别
)

# 创建一个随机输入张量,并通过每一层,打印输出形状
X = torch.rand(size=(1, 1, 96, 96))
for layer in net:
    X = layer(X)
    print(layer.__class__.__name__, 'output shape:\t', X.shape)

# 训练参数
lr, num_epochs, batch_size = 0.1, 10, 128
# 加载数据集
train_iter, test_iter = lp.loda_data_fashion_mnist(batch_size, resize=96)
# 训练模型
lp.train_ch6(net, train_iter, test_iter, num_epochs, lr, lp.try_gpu())
# 显示训练过程中的图表
plt.show()

# 训练结果:
# 损失 0.254, 训练准确率 0.904, 测试准确率 0.866
# 1534.2 examples/sec on cuda:0

# loss 0.246, train acc 0.906, test acc 0.891
# 1492.9 examples/sec on cuda:0

运行效果:

相关推荐
John jj12 分钟前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
又折桃枝换酒钱24 分钟前
CycleChart:一个统一的基于一致性学习的双向图表理解与生成框架(翻译与解读)
人工智能·深度学习·学习
从零开始学习人工智能1 小时前
PyTorch 踩坑:Input type \(Half\) and bias type \(float\) 类型不匹配终极解决方案
人工智能·pytorch·python
卡梅德生物科技小能手2 小时前
卡梅德生物科普 TSLP(胸腺基质淋巴细胞生成素)
经验分享·深度学习·生活
方品2 小时前
【无标题】
服务器·人工智能·深度学习·nlp
Zzj_tju2 小时前
Reasoning Models 论文精读路线:CoT、Self-Consistency、Process Supervision 与 Search
人工智能·深度学习·自然语言处理
具身新纪元2 小时前
CVPR 2026|新缺陷不断上线,如何让工业视觉检测模型不忘旧账?
人工智能·深度学习·目标检测·机器学习·计算机视觉·目标跟踪·视觉检测
盼小辉丶3 小时前
PyTorch计算机视觉(5)——生成对抗网络(Generative Adversarial Network,GAN)
pytorch·生成对抗网络·计算机视觉
手写码匠15 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
Lee_jerome17 小时前
python神经网络编程入门(二十五)——IMDB 数据集预处理与词汇表构建
rnn·深度学习·词频统计·文本预处理·imdb数据集·词表构建·nlp入门