al+大数据每日学习笔记33

2026年9月5日

今天总结一下深度学习中卷积神经网络CNN

在上一章我们学习了全连接神经网络的基础,但全连接网络存在参数量大、无法提取空间特征、泛化能力弱 的致命问题,极其不适合图像任务。而CNN卷积神经网络是专为图像识别、视觉任务而生的核心模型,依靠局部感知、权值共享、降采样三大特性,成为深度学习计算机视觉的基石。

本文将完整总结CNN全部核心知识点:图像数字化原理、CNN三层核心结构、卷积计算、池化原理、经典CNN模型、数据增强、学习率调优、迁移学习、ResNet残差网络,最后附带可直接运行的CNN手写数字识别完整代码

一、图像在计算机中的存储原理

计算机无法直接识别图片,所有图像本质都是数字矩阵

  • 灰度图 :二维矩阵,像素值范围 0~255,0代表纯黑,255代表纯白。

  • RGB彩色图 :三维张量 [通道, 高, 宽],由红、绿、蓝三个单通道矩阵叠加而成,通道(channel)是图像特征的核心维度。

CNN的核心优势是具备画面不变性:无论物体在图像的左侧、右侧、缩放、平移,网络都能识别为同一物体,这是传统全连接网络不具备的能力。

二、CNN核心三层结构

标准卷积神经网络由 卷积层 + 池化层 + 全连接层 堆叠构成,各司其职、逐级提取特征。

2.1 卷积层(特征提取核心)

卷积是CNN的核心操作,本质是图像局部窗口与卷积核(滤波器)做内积运算,提取图像边缘、纹理、轮廓、高级语义特征,模拟人眼视物逻辑(先轮廓、后细节)。

卷积三大超参数
  • 步长 stride:卷积核每次滑动的像素距离,步长越大,输出特征图尺寸越小。

  • 填充 padding:在图像边缘补0,解决卷积后图像尺寸缩小、边缘特征丢失问题,可精准控制输出尺寸。

  • 卷积核个数 depth:决定输出特征图的厚度,个数越多,提取的特征维度越丰富。

卷积输出尺寸计算公式

输出尺寸 = (输入尺寸 - 卷积核尺寸 + 2×padding) / stride + 1

示例:32×32×3输入图像,10个5×5卷积核,stride=1,padding=2

(32 - 5 + 2×2) / 1 + 1 = 32,最终输出 32×32×10 特征图

卷积参数特点

卷积核参数只和核大小、通道数有关,与图像尺寸无关。250×250与500×500的同通道图像,使用相同卷积核,参数数量完全一致,这也是CNN参数远少于全连接网络的核心原因。

2.2 池化层 Pooling(降采样)

池化层无参数、不训练,核心作用是压缩特征图尺寸、减少计算量、抑制过拟合、保留核心特征,通常穿插在卷积层之间。

主流两种池化方式:

  • 最大池化 MaxPool(最常用):取窗口内最大值,保留纹理、边缘核心特征,抗干扰能力强。

  • 平均池化 AvgPool:取窗口内平均值,保留整体特征,易模糊细节。

2.3 全连接层(分类输出)

经过多层卷积+池化提取完图像特征后,通过 Flatten 将三维特征图展平为一维向量,再通过全连接层完成特征映射,最终输出分类结果,实现图像识别任务。

三、经典CNN模型演进

从初代网络到深层残差网络,CNN模型迭代核心是:更深、更轻、更准、更快,主流经典模型汇总:

  • LeNet:首个成功落地的卷积神经网络,奠定CNN基础结构。

  • AlexNet:加深网络层数,首创卷积+池化堆叠结构,开启深度学习视觉时代。

  • ZF Net:优化卷积核尺寸与步长,精细化浅层特征提取。

  • VGGNet:极简统一结构,全程使用3×3卷积+2×2池化,结构规整易复刻。

  • GoogLeNet:引入Inception模块,大幅减少模型参数量,轻量化优势显著。

  • ResNet残差网络:解决深层网络梯度消失与退化问题,工业界、竞赛主流模型。

  • DenseNet:全层跨连接,最大化利用特征信息。

四、深度学习训练进阶核心技巧

4.1 数据增强 Data Augmentation

针对数据集不足、模型过拟合问题,通过图像变换扩充数据多样性,提升模型泛化能力,常用方式:随机翻转、随机旋转、随机裁剪、颜色变换。

4.2 学习率动态调整

固定学习率存在缺陷:前期收敛慢、后期不收敛。动态调优策略:前期大学习率快速收敛,后期小学习率精细最优解 。PyTorch通过 torch.optim.lr_scheduler 实现三类调优方式:

  1. 有序调整:StepLR等间隔衰减、MultiStepLR多节点衰减、ExponentialLR指数衰减、CosineAnnealingLR余弦退火。

  2. 自适应调整:ReduceLROnPlateau,监控loss/acc指标,指标停滞时自动降学习率。

  3. 自定义调整:LambdaLR,自定义epoch学习率函数,支持分层设置学习率。

4.3 迁移学习

核心思想:复用大型数据集预训练模型权重,微调适配自有任务,解决小数据集训练、训练慢、精度低问题。

通用流程:加载预训练模型 → 冻结主干参数 → 新增自定义全连接层 → 训练新层 → 解冻部分层微调 → 评估优化。

4.4 ResNet核心创新(解决深层网络痛点)

传统深层CNN存在两大致命问题:梯度消失/梯度爆炸、网络退化。ResNet通过两大方案解决:

  • BN批量归一化:统一特征图分布(均值0、方差1),稳定训练、缓解梯度异常。

  • 残差捷径连接:跨层直连,弱化多层强依赖,让深层网络可训练、不退化。

五、实战:矿物分类神经网络完整案例

除了经典的图像CNN任务外,深度学习网络同样适用于结构化数据分类任务 。下面为一套工业实战案例:基于全连接神经网络实现矿物类型多分类。案例包含数据读取、数据清洗、标准化、标签编码、模型训练、指标评估(准确率、精确率、召回率、F1)全套流程。

复制代码
# 导入核心依赖库
import torch
import torch.nn as nn
import pandas as pd
import os
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.preprocessing import LabelEncoder, StandardScaler

# ===================== 1. 项目配置与数据读取 =====================
# 数据填充方式
METHOD = '平均值填充'
# 项目根目录(可自行修改)
BASE_DIR = r'C:\Users\赵永奇\PycharmProjects\pythonProject1\numpy'

# 读取训练/测试数据集
train_path = os.path.join(BASE_DIR, f"训练数据集[{METHOD}].xlsx")
test_path  = os.path.join(BASE_DIR, f"测试数据集[{METHOD}].xlsx")
train_df = pd.read_excel(train_path)
test_df  = pd.read_excel(test_path)

# 剔除无效索引列
for df in [train_df, test_df]:
    if 'Unnamed: 0' in df.columns:
        df.drop('Unnamed: 0', axis=1, inplace=True)

# 划分特征与标签
train_data_x = train_df.drop('矿物类型', axis=1)
train_data_y_raw = train_df['矿物类型']
test_data_x  = test_df.drop('矿物类型', axis=1)
test_data_y_raw = test_df['矿物类型']

# 数据清洗:转为数值型,空值填充0
train_data_x = train_data_x.apply(pd.to_numeric, errors='coerce').fillna(0)
test_data_x = test_data_x.apply(pd.to_numeric, errors='coerce').fillna(0)

# ===================== 2. 数据预处理(标准化+标签编码) =====================
# 特征标准化:加速网络收敛、提升训练稳定性
scaler = StandardScaler()
train_data_x = scaler.fit_transform(train_data_x)
test_data_x = scaler.transform(test_data_x)

# 标签编码:将文字矿物类型转为数字标签
le = LabelEncoder()
all_y = pd.concat([train_data_y_raw, test_data_y_raw])
le.fit(all_y)
train_data_y = le.transform(train_data_y_raw)
test_data_y = le.transform(test_data_y_raw)

# 获取输入维度与分类数
input_dim = train_data_x.shape[1]
num_classes = len(le.classes_)
print(f"输入特征维度 input_dim = {input_dim}")
print(f"数据集类别总数 num_classes = {num_classes}\n")

# ===================== 3. 搭建简易神经网络模型 =====================
class MineralNet(nn.Module):
    # 双层全连接网络,适配结构化多分类任务
    def __init__(self, in_dim, n_class):
        super(MineralNet, self).__init__()
        self.fc1 = nn.Linear(in_dim, 32)   # 隐藏层
        self.fc2 = nn.Linear(32, n_class)  # 输出分类层

    def forward(self, x):
        x = self.fc1(x)
        x = self.fc2(x)
        return x

# 数据转为PyTorch张量格式
X_train = torch.tensor(train_data_x.astype(np.float32), dtype=torch.float32)
Y_train = torch.tensor(train_data_y, dtype=torch.long)
X_test  = torch.tensor(test_data_x.astype(np.float32), dtype=torch.float32)
Y_test  = torch.tensor(test_data_y, dtype=torch.long)

# ===================== 4. 模型初始化与超参数配置 =====================
model = MineralNet(input_dim, num_classes)
criterion = nn.CrossEntropyLoss()       # 多分类通用损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)  # 随机梯度下降优化器

# ===================== 5. 模型评估函数 =====================
def evaluate_model(model, X_data, Y_data, train_or_test):
    size = len(X_data)
    with torch.no_grad():  # 评估阶段关闭梯度,节省算力、防止过拟合
        predictions = model(X_data)
        correct = (predictions.argmax(1) == Y_data).type(torch.float).sum().item()
        acc = correct / size
        print(f"{train_or_test}: \t Accuracy: {(100 * acc):.2f}%")
    return acc

# ===================== 6. 模型迭代训练 =====================
epochs = 15000
accs = []  # 记录每轮测试准确率

for epoch in range(epochs):
    # 前向传播计算损失
    outputs = model(X_train)
    loss = criterion(outputs, Y_train)

    # 反向传播+参数更新
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    # 每100轮打印一次训练日志并评估模型
    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}')
        train_acc = evaluate_model(model, X_train, Y_train, 'train')
        test_acc = evaluate_model(model, X_test, Y_test, 'test')
        accs.append(test_acc * 100)

# ===================== 7. 最终全套指标评估 =====================
model.eval()
with torch.no_grad():
    pred_out = model(X_test)
    y_pred_np = pred_out.argmax(dim=1).cpu().numpy()
    y_true_np = Y_test.cpu().numpy()

# 计算四大核心评估指标
acc_nn = accuracy_score(y_true_np, y_pred_np)
prec_nn = precision_score(y_true_np, y_pred_np, average="macro", zero_division=0)
rec_nn = recall_score(y_true_np, y_pred_np, average="macro", zero_division=0)
f1_nn = f1_score(y_true_np, y_pred_np, average="macro", zero_division=0)

# 输出最终结果
print(f"\n===== 矿物分类神经网络结果【{METHOD}】 =====")
print(f"训练过程最高测试准确率: {max(accs):.2f}%")
print(f"15000轮训练最终指标 || acc:{acc_nn:.4f}, precision:{prec_nn:.4f}, recall:{rec_nn:.4f}, f1:{f1_nn:.4f}")

案例核心知识点总结

  1. 数据预处理闭环:实现Excel结构化数据读取、空值清洗、特征标准化、分类标签编码,是深度学习结构化任务的标准预处理流程;

  2. 基础网络搭建:采用双层全连接网络,适配一维结构化数据多分类任务,结构简洁、训练高效;

  3. 训练机制:使用SGD随机梯度下降优化器、交叉熵损失函数,适配多分类场景;

  4. 完整评估体系:不仅输出准确率,同时计算精确率、召回率、F1分数,全面衡量模型性能,避免单一指标偏差。

六、章节总结

CNN是计算机视觉的核心基石,彻底解决了全连接网络的视觉任务缺陷,核心知识点闭环如下:

  1. 核心结构:卷积层提特征、池化层降维、全连接层分类,三层堆叠构成标准CNN;

  2. 核心优势:局部感知、权值共享、尺寸不变性,参数更少、泛化能力更强;

  3. 进阶优化:数据增强解决数据不足,动态学习率优化收敛效果,迁移学习适配小样本任务;

  4. 经典突破:ResNet残差结构+BN层,攻克深层网络梯度消失与退化难题,成为工业界通用模型;

  5. 工程落地:掌握CNN搭建、训练调优、参数优化,可完成基础图像分类、回归任务(如人脸关键点检测)。

相关推荐
hfywmsj1 小时前
广州餐饮铺位招租的选址架构:流量入口与成本函数分析
java·大数据·jvm·广州餐饮铺位招租
lifallen1 小时前
Agent 框架不是 API 包装器,而是一个微型操作系统内核
人工智能·学习·ai·ai编程
ACP广源盛139246256731 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#IX6024 PCIe2.0 交换芯片在轻量化 AI 服务中的机会与应用场景
大数据·数据库·人工智能·嵌入式硬件·macos·开源
是隼人1 小时前
buuctf-pwn pwnable_start(ret2shellcode)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
码力斜杠哥1 小时前
Docker Compose快速入门笔记
笔记·docker·eureka
my05922 小时前
跳出单一信息工具局限:奥米豆构建认知与心智并行的学习范式
大数据·人工智能·python·学习
qq_425516182 小时前
一句话生成PPT的录音APP:会议材料生成能力对比
大数据·人工智能·powerpoint
却道天凉_好个秋2 小时前
音视频学习(一百零五):Access Unit (AU)和RTP分包
学习·音视频·access unit·rtp分包
知产xiao_xin2 小时前
版权的精神权利
经验分享·笔记·知识产权