卷积神经网络(CNN)入门实践及Sequential 容器封装

学习链接:https://www.bilibili.com/video/BV1hE411t7RN?t=1.4&p=22

推荐网站:CS231n 用于计算机视觉的深度学习

一、CNN 核心层的作用与原理

在搭建模型前,先明确 CNN 中各核心层的功能:

层类型 作用 关键参数示例
卷积层(Conv2d) 提取图像局部特征(如边缘、纹理),通过卷积核实现特征映射 Conv2d(3, 32, 5, padding=2)(输入通道 3,输出通道 32,核大小 5×5,填充 2)
池化层(MaxPool2d) 下采样压缩特征图,减少计算量,同时保留关键特征 MaxPool2d(2)(2×2 窗口做最大池化)
展平层(Flatten) 将二维特征图转换为一维向量,为全连接层做准备 ------
全连接层(Linear) 对提取的特征做非线性变换,最终实现分类或回归任务 Linear(1024, 64)(输入维度 1024,输出维度 64)

二、两种 CNN 模型构建方式对比

我们可以用 "分步骤定义层"和"Sequential 容器封装" 两种方式构建完全等价的 CNN 模型。

方式 1:分步骤定义每一层

这种方式更直观,适合初学者理解每一层的执行顺序:

python 复制代码
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear

class Prayer(nn.Module):
    def __init__(self):
        super(Tudui, self).__init__()
        # 定义各层
        self.conv1 = Conv2d(3, 32, 5, padding=2)  # 第一层卷积
        self.maxpool1 = MaxPool2d(2)             # 第一层池化
        self.conv2 = Conv2d(32, 32, 5, padding=2) # 第二层卷积
        self.maxpool2 = MaxPool2d(2)             # 第二层池化
        self.conv3 = Conv2d(32, 64, 5, padding=2) # 第三层卷积
        self.maxpool3 = MaxPool2d(2)             # 第三层池化
        self.flatten = Flatten()                 # 展平层
        self.linear1 = Linear(1024, 64)          # 第一层全连接
        self.linear2 = Linear(64, 10)            # 第二层全连接(10类分类)

    def forward(self, x):
        # 按顺序执行各层
        x = self.conv1(x)
        x = self.maxpool1(x)
        x = self.conv2(x)
        x = self.maxpool2(x)
        x = self.conv3(x)
        x = self.maxpool3(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.linear2(x)
        return x

# 测试模型
prayer = Prayer()
print(prayer)
input = torch.ones((64, 3, 32, 32))  # 模拟输入:批量64、3通道、32×32图像
output = prayer(input)
print(output.shape)  # 输出应为torch.Size([64, 10])

方式 2:Sequential 容器封装(更简洁)

当层的执行顺序很明确时,用Sequential把层 "打包",代码更简洁:

python 复制代码
import torch
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential

class Prayer(nn.Module):
    def __init__(self):
        super(Prayer, self).__init__()
        self.model1 = Sequential(
            Conv2d(3, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self, x):
        x = self.model1(x)
        return x

# 测试模型
# prayer = Prayer()
# print(tudui)
# input = torch.ones((64, 3, 32, 32))  # 模拟输入:批量64、3通道、32×32图像
# output = prayer(input)
# print(output.shape)  # 输出应为torch.Size([64, 10])

# 测试模型
prayer = Prayer()
print(prayer)
input = torch.ones((64, 3, 32, 32))
output = prayer(input)
print(output.shape)  # 同样输出torch.Size([64, 10])

三、用 TensorBoard 可视化模型结构

python 复制代码
from torch.utils.tensorboard import SummaryWriter

# 初始化SummaryWriter,指定日志保存路径
writer = SummaryWriter("../logs_seq")
# 传入模型和测试输入,生成计算图
writer.add_graph(prayer, input)
writer.close()

运行代码后,在终端执行命令:

python 复制代码
tensorboard --logdir=../logs_seq

然后打开浏览器访问http://localhost:6006,就能看到模型的计算图了,每一层的连接关系一目了然~

四、模型应用场景

这个 CNN 模型的结构非常经典,适合作为图像分类任务的 "baseline(基准)",比如:

  • 对 CIFAR-10 数据集(10 类彩色小图像)做分类;
  • 自定义小型图像数据集的分类任务;
  • 作为更复杂 CNN 模型的 "基石",在此基础上添加残差连接、注意力机制等模块。
相关推荐
ZKNOW甄知科技1 分钟前
燕千云迭代版本发布:智能Agent深入业务现场
运维·人工智能·低代码·机器学习·自然语言处理·自动化·aigc
机器学习之心8 分钟前
基于CNN-BiLSTM的轴承剩余寿命预测,MATLAB代码
matlab·cnn·cnn-bilstm·轴承剩余寿命预测
蒲公英内测分发9 分钟前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
危险、12 分钟前
AI写的计划方案领导不满意?试下我这个反复打磨的计划方案提示词?
人工智能
镜象科技16 分钟前
ACT自助干预适用人群:谁适合、谁不适合、边界在哪
人工智能
集芯微电科技有限公司17 分钟前
集芯微电科技推出5.5V/10A集成功率MOSFET降压DC/DC转换器
人工智能·科技·单片机·嵌入式硬件·神经网络·生成对抗网络
打工仔折腾 AI19 分钟前
Linux 网络编程:从零掌握 TCP Socket 编程与 C++ 实战落地
linux·网络·人工智能·后端·python·tcp/ip·性能优化
科威网络19 分钟前
RAG 系统落地:向量库、文档切片与检索效果优化实践
人工智能·软件需求
QuZhengRong28 分钟前
【News】2026.10.16 – 10.21 AI 科技周报
人工智能·科技·openai·谷歌·新闻
IT枫斗者枫哥28 分钟前
Spring AI文档更新后仍命中旧内容:核对分片ID、来源和版本
java·人工智能