卷积神经网络(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 模型的 "基石",在此基础上添加残差连接、注意力机制等模块。
相关推荐
chatexcel26 分钟前
元空AI+Clawdbot:7×24 AI办公智能体新形态详解(长期上下文/自动化任务/工具粘合)
运维·人工智能·自动化
All The Way North-29 分钟前
彻底掌握 RNN(实战):PyTorch API 详解、多层RNN、参数解析与输入机制
pytorch·rnn·深度学习·循环神经网络·参数详解·api详解
bylander42 分钟前
【AI学习】TM Forum《Autonomous Networks Implementation Guide》快速理解
人工智能·学习·智能体·自动驾驶网络
Techblog of HaoWANG1 小时前
目标检测与跟踪 (8)- 机器人视觉窄带线激光缝隙检测系统开发
人工智能·opencv·目标检测·机器人·视觉检测·控制
laplace01231 小时前
Claude Skills 笔记整理
人工智能·笔记·agent·rag·skills
2501_941418551 小时前
【计算机视觉】基于YOLO11-P6的保龄球检测与识别系统
人工智能·计算机视觉
码农三叔1 小时前
(8-3)传感器系统与信息获取:多传感器同步与传输
人工智能·机器人·人形机器人
人工小情绪1 小时前
Clawbot (OpenClaw)简介
人工智能
2501_933329552 小时前
品牌公关AI化实践:Infoseek舆情系统技术架构解析
人工智能·自然语言处理
咋吃都不胖lyh2 小时前
CLIP 不是一个 “自主判断图像内容” 的图像分类模型,而是一个 “图文语义相似度匹配模型”—
人工智能·深度学习·机器学习