当前位置: 首页 > 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;原始类型&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...