当前位置: 首页 > news >正文

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类


引言

卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer,CNN 的发展推动了图像分类、目标检测和语义分割等任务的突破。在本集中,我们将深入探讨 CNN 的基本原理,回顾经典架构的发展历程,并通过实战项目使用 ResNet 实现 CIFAR-10 图像分类任务。最后,我们还将探讨大模型中的视觉架构,如 Vision Transformer (ViT),展望未来的技术趋势。

在这里插入图片描述


一、卷积神经网络的基本原理

1.1 卷积层

卷积层是 CNN 的核心组件,负责提取图像的空间特征。卷积操作通过对输入图像应用滤波器(Filter),生成特征图(Feature Map)。

  • 作用:捕捉局部特征(如边缘、纹理)。
  • 公式
    在这里插入图片描述
卷积层示意图:

图 1: 卷积操作示意图
在这里插入图片描述

1.2 池化层

池化层用于降维,减少计算量并增强模型的鲁棒性。常见的池化操作包括:

  • 最大池化(Max Pooling):取局部区域的最大值。
  • 平均池化(Average Pooling):取局部区域的平均值。
池化层示意图:

图 2: 最大池化操作示意图
在这里插入图片描述

1.3 批归一化(Batch Normalization)

批归一化通过对每一批数据进行标准化处理,加速训练并提高模型稳定性。

  • 作用:缓解梯度消失问题,提升收敛速度。
  • 公式
    在这里插入图片描述

二、经典 CNN 架构

2.1 LeNet

LeNet 是最早的 CNN 架构之一,由 Yann LeCun 提出,主要用于手写数字识别。

  • 特点:包含卷积层、池化层和全连接层。
  • 应用:MNIST 数据集。
LeNet 结构图:

图 3: LeNet 架构图
在这里插入图片描述

2.2 AlexNet

AlexNet 在 2012 年 ImageNet 竞赛中取得突破性成绩,标志着深度学习时代的到来。

  • 特点:引入 ReLU 激活函数、Dropout 和 GPU 加速。
  • 创新点:首次使用多层卷积网络。
AlexNet 结构图:

图 4: AlexNet 架构图
在这里插入图片描述

2.3 VGG

VGG 以简单的结构和强大的性能著称,通过堆叠多个 3x3 卷积核实现深层网络。

  • 特点:统一使用 3x3 卷积核,参数量较大。
  • 应用:ImageNet、迁移学习。
VGG 结构图:

图 5: VGG 架构图
在这里插入图片描述

2.4 ResNet

ResNet 引入残差连接(Residual Connection),解决了深层网络中的梯度消失问题。

  • 特点:通过跳跃连接(Skip Connection)实现信息流动。
  • 创新点:支持训练超过 100 层的网络。
ResNet 结构图:

图 6: ResNet 残差块结构图
在这里插入图片描述


三、实战项目:使用 ResNet 实现 CIFAR-10 图像分类

3.1 数据集介绍

CIFAR-10 数据集包含 10 类彩色图像(如飞机、汽车、猫等),每类 6,000 张图片,其中 50,000 张用于训练,10,000 张用于测试。

CIFAR-10 样例:

图 7: CIFAR-10 数据集样例
在这里插入图片描述

3.2 使用 PyTorch 实现

以下代码展示了如何使用预训练的 ResNet 模型对 CIFAR-10 进行微调。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models# 数据预处理
transform = transforms.Compose([transforms.Resize(224),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])train_dataset = datasets.CIFAR10(root='./data', train=True, transform=transform, download=True)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=transform)train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)# 加载预训练的 ResNet 模型
model = models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 10)  # 修改最后一层以适应 CIFAR-10 的 10 类# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)# 训练模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)for epoch in range(5):model.train()running_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")# 测试模型
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in test_loader:images, labels = images.to(device), labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)total += labels.size(0)correct += (predicted == labels).sum().item()print(f"Test Accuracy: {correct / total:.4f}")

程序运行后输出:

Epoch 1, Loss: 0.5615
Epoch 2, Loss: 0.3187
Epoch 3, Loss: 0.2207
Epoch 4, Loss: 0.1634
Epoch 5, Loss: 0.1233
Test Accuracy: 0.9017

可以看到五个批次训练后,最终的精确率是90.17%.

模型选择:为什么选择 PyTorch 而不是 TensorFlow

在本实战项目中,我们选择了 PyTorch 作为实现 ResNet 的框架。以下是详细的原因分析和对比:

1. 动态计算图 vs 静态计算图

  • PyTorch 使用动态计算图(Dynamic Computation Graph),允许开发者在运行时动态构建网络结构。这种灵活性非常适合研究和实验,尤其是在需要调试或修改模型结构时。
  • TensorFlow 在早期版本中主要依赖静态计算图(Static Computation Graph),虽然从 TensorFlow 2.x 开始引入了 Eager Execution 模式以支持动态图,但其底层仍保留了静态图的复杂性,可能增加学习成本。

优势:PyTorch 的动态图设计使得代码更加直观,易于理解和调试,特别适合初学者和研究人员。


2. 社区与生态系统

  • PyTorch 的社区活跃度近年来迅速增长,尤其在学术界备受青睐。许多最新的深度学习研究成果(如 Vision Transformer、Diffusion Models)都优先提供 PyTorch 实现。
  • TensorFlow 的生态系统更加成熟,特别是在工业部署领域具有明显优势,但在研究领域的创新速度相对较慢。

优势:对于本项目中的图像分类任务,PyTorch 提供了更丰富的预训练模型(如 torchvision.models),并且社区资源丰富,便于快速实现和验证。


3. 易用性与代码简洁性

  • PyTorch 的 API 设计更加 Pythonic,代码风格接近原生 Python,降低了学习门槛。例如,在定义模型时,PyTorch 使用类继承的方式(nn.Module),逻辑清晰且易于扩展。
  • TensorFlow 的 Keras API 虽然提供了高层次封装,但在某些场景下可能显得不够灵活,尤其是当需要自定义层或损失函数时。

优势:PyTorch 的代码更加简洁直观,适合快速原型开发和教学。


4. 性能与硬件支持

  • PyTorchTensorFlow 在性能上基本相当,但在 GPU 加速方面,PyTorch 对 CUDA 的支持更为直接,开发者可以轻松利用 GPU 进行加速。
  • TensorFlow 提供了对 TPU 的原生支持,这在大规模分布式训练中是一个显著优势,但对于中小型项目(如 CIFAR-10 分类),TPU 的优势并不明显。

优势:对于本项目,PyTorch 的 GPU 支持已经足够满足需求,且配置简单。


5. 可视化工具

  • TensorFlow 提供了强大的可视化工具 TensorBoard,能够实时监控训练过程、绘制损失曲线和可视化模型结构。
  • PyTorch 的可视化工具相对较少,但可以通过第三方库(如 TensorBoardX 或内置的 torch.utils.tensorboard)实现类似功能。

劣势:PyTorch 在可视化方面稍逊于 TensorFlow,但对于本项目来说,这一差距并不影响核心任务的完成。


综合以上分析,我们选择 PyTorch 的主要原因在于其动态计算图的灵活性、Pythonic 的代码风格以及丰富的研究社区支持。尽管 TensorFlow 在工业部署和分布式训练方面具有优势,但对于本项目的图像分类任务,PyTorch 更加适合快速实现和迭代。如果你对 TensorFlow 的实现感兴趣,也可以尝试使用 Keras API 构建类似的 ResNet 模型,体验两种框架的不同之处!


四、前沿关联:大模型中的视觉架构(Vision Transformer, ViT)

随着 Transformer 在自然语言处理中的成功,研究者将其引入计算机视觉领域,提出了 Vision Transformer (ViT)。

  • 特点
    • 将图像分割为固定大小的 Patch,作为输入序列。
    • 使用自注意力机制捕捉全局依赖关系。
  • 优势
    • 在大规模数据集上表现优异。
    • 可扩展性强,适合超大规模模型。
ViT 结构图:

图 8: Vision Transformer 架构图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


总结

本集详细介绍了卷积神经网络的基本原理和经典架构,并通过实战项目展示了如何使用 ResNet 实现 CIFAR-10 图像分类任务。最后,我们探讨了 Vision Transformer 的前沿技术,展望了计算机视觉的未来方向。

希望这篇文章能为你提供清晰的学习路径!如果你有任何问题或想法,欢迎在评论区留言讨论。


附图

  • 图 1: 卷积层示意图
  • 图 2: 池化层示意图
  • 图 3: LeNet 架构图
  • 图 4: AlexNet 架构图
  • 图 5: VGG 架构图
  • 图 6: ResNet 残差块结构图
  • 图 7: CIFAR-10 数据集样例
  • 图 8: Vision Transformer 架构图

下集预告:第3集将聚焦于循环神经网络(RNN)与序列建模任务,带你深入了解 LSTM 和 GRU 的改进及其在时间序列预测中的应用。

相关文章:

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类 引言 卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…...

AD(Altium Designer)器件封装——立创商城导出原理图和PCB完成器件封装操作指南

目录 1、立创商城下载原理图和PCB图 1.1 打开立创商城 1.2 寻找所需器件 1.3 确定所需芯片 1.4 打开原理图和PCB图 1.5 导出原理图 1.6 确定导出为AD文件 1.7 下载成功 1.8 导出PCB 1.9 确定导出为AD文件 1.10 原理图PCB下载成功 2、原理图和PCB图预处理 2.1 复制…...

DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…...

LangChain系列:精通LangChain的合并文档链

LangChain的合并链旨在解决语言模型处理长文本时的上下文限制问题,包含Stuff、MapReduce、Refine和Rerank四种策略。Stuff链通过简单拼接文档块实现快速处理,适用于短文本但受限于模型token容量;MapReduce链采用分治思想,先独立处…...

rtcwake - Linux下定时唤醒计算机

rtcwake 是一个用于通过实时时钟(RTC)唤醒计算机的工具。它常用于在 Linux 系统中设置计算机在指定时间自动唤醒或关闭。以下是对命令 rtcwake -m off -s ${sleep_time} 的详细解析: 命令解析 bash复制 rtcwake -m off -s ${sleep_time} 1…...

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一,旨在通过合理配置资产,实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱,成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…...

什么是“可迭代”

在 Python 中,“可迭代”(Iterable)是一个非常重要的概念,它指的是任何可以被逐个访问其元素的对象。换句话说,如果一个对象支持迭代操作(比如可以通过 for 循环逐个访问其元素),那么…...

Python天梯赛10分题-念数字、求整数段和、比较大小、计算阶乘和

007-念数字 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式: 输入在一行中给出一个整数,如&…...

C#初级教程(6)——函数:从基础到实践

一、函数的核心价值:简化与复用代码 以游戏开发项目为例,在游戏中,角色的移动、攻击等行为并非只在单一场景中出现。设想一下,若每次需要角色执行这些行为时,都要重新编写对应的代码,那将是何等繁琐且易错的…...

【Bluedroid】AVRCP 连接源码分析(一)

一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…...

编程考古-忘掉它,Delphi 8 for the Microsoft .NET Framework

忘掉它吧,作一篇记录! 【圣何塞,加利福尼亚 – 2003年11月3日】在今日的Borland开发者大会上,Borland正式推出了Delphi 8 for Microsoft .NET Framework。这款新版本旨在为Delphi开发者提供一个无缝迁移路径,将现有的…...

Linux-Ansible基础模块

文章目录 模块Command模块Shell模块Script模块 🏡作者主页:点击! 🤖Linux专栏:点击! ⏰️创作时间:2025年02月22日19点21分 模块 Command模块 Command模块实践 ansible 192.168.1.100 -m com…...

正则表达式–断言

原文地址:正则表达式–断言 – 无敌牛 欢迎参观我的个人博客:正则表达式特殊字符 – 无敌牛 断言assertions 1、(?...):正向预查(positive lookahead),表示某个字符串后面应该跟着什么。但这个字符串本身…...

Swiper插件的运用和学习

Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 Swiper 是目前最流行的免费开源轮播组件之一,它功能强大、高度可定制且兼容性好,支持移动端手势操作和丰富的交互动画。 下载Swiper压缩包 轮播图演示页面。可以看见各种不同切换效果的轮播图 然后解压…...

标准I/O与文件I/O

一、概念 标准IO:标准IO是指程序与标准输入(stdin)、标准输出(stdout)和标准错误(stderr)之间的输入输出操作。通常用于与用户交互或输出调试信息。文件IO:文件IO是指程序与文件系统…...

JavaScript函数-函数的参数

在JavaScript编程语言中,函数是组织代码和实现复杂逻辑的基本单元。而函数参数则是这些功能的重要组成部分,它们允许我们将数据传递给函数,从而使得函数更加通用和灵活。本文将深入探讨JavaScript函数参数的各种特性及其最佳实践。 参数基础…...

Android TabLayout 实现随意控制item之间的间距

效果 红色标注是不同的间距。 实现方式 1、xml中定义 <com.google.android.material.tabs.TabLayoutandroid:id"id/tab_layout"android:layout_width"wrap_content"app:tabIndicatorColor"color/color_FF00B2E3"app:tabBackground"a…...

STM32的“Unique device ID“能否修改?

STM32F1系列的"Unique device ID"寄存器的地址为0x1FFFF7E8。 这个寄存器是只读的。 "Unique device ID"寄存器位于“System memory”中。“System memory”地址范围为“0x1FFF F000- 0x1FFF F7FF”。 所有STM32 MCU上都存在系统引导加载程序。顾名思义&a…...

STM32-温湿度上传OneNET项目

一、项目需求 使用 ESP8266 连接 OneNET 云平台&#xff0c;并通过 MQTT 协议上传 DHT11 获取的温湿度值。 二、项目框图 三、DHT11工作原理 参考于良许嵌入式手把手教你玩转DHT11&#xff08;原理驱动&#xff09; | 良许嵌入式 3.1 正常工作验证 #​ 上电后&#xff…...

前端面试-JavaScript 数据类型详解

目录 一、数据类型分类 二、核心区别对比 1. 存储方式 2. 比较方式 3. 类型检测方法 三、特殊类型详解 1. Symbol 2. BigInt 3. null vs undefined 四、常见面试扩展问题 五、总结 一、数据类型分类 JavaScript 数据类型分为 基本数据类型&#xff08;原始类型&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...