卷积神经网络(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 模型的 "基石",在此基础上添加残差连接、注意力机制等模块。
相关推荐
阿图灵3 分钟前
Agentic AI 架构入门(十二·完结):ADLC、AgentOps 与企业级平台蓝图
人工智能·架构·ai agent·智能体·agentops·agentic ai·adlc
达达尼昂8 分钟前
Flutter AI Harness 如何让 Agent 参与软件开发全流程
android·人工智能·后端
人工智能研究所12 分钟前
GitHub 10k+ Star:用自然语言描述系统,AI 帮你生成可交互架构图
人工智能·github·交互·自然语言·系统架构图·archify
王六米。12 分钟前
武汉自动意志科技有限公司:人工智能应用软件开发:OpenClaw 企业部署怎样配置权限、日志和回滚
人工智能·科技·企业ai落地·ai智能体开发·openclaw部署·武汉自动意志科技·智钳claw
yangmu320313 分钟前
脑机接口:当意识越过肉身的边界
人工智能·科技
Warren2Lynch15 分钟前
从文本到架构:Visual Paradigm AI Chatbot V2 深度评测与实战指南引言
人工智能·架构
GoCodingInMyWay19 分钟前
PaddleOCR 开始
pytorch·ai·ocr
断眉的派大星26 分钟前
ViT 与 VLM 中视觉 Token 的关系学习笔记
人工智能·transformer
cxr82828 分钟前
D2E 深度剖析 时序工具链
人工智能·架构
陆枫Larry29 分钟前
从 Agent = Model + Harness 说起:重新看看 Cursor、Claude Code 和 Codex区别
人工智能