机器学习05-CNN
CNN(卷积神经网络)学习文档
一、引言
卷积神经网络(Convolutional Neural Network,CNN)是深度学习中的一种重要网络结构,在图像识别、计算机视觉等领域取得了巨大成功。CNN 的设计灵感来源于生物视觉系统的研究,通过构建多层神经网络,能够自动学习图像中的特征层次结构,从而实现高效的图像分类、目标检测等任务。
二、CNN 的基本结构
-
卷积层
- 卷积层是 CNN 的核心组成部分,其主要功能是对输入图像进行卷积操作,提取图像中的局部特征。卷积操作通过一组可学习的卷积核(filter)与输入图像的局部区域进行逐元素相乘并求和,得到卷积后的特征图(feature map)。卷积核的大小、数量以及步长(stride)等参数决定了卷积层的输出特征图的大小和数量。
- 例如,假设输入图像大小为 28×28,卷积核大小为 3×3,步长为 1,且不进行填充(padding),则输出特征图的大小为(28 - 3 + 1)×(28 - 3 + 1)=26×26。若使用多个卷积核,每个卷积核对应一个特征图,则输出特征图的数量等于卷积核的数量。
-
激活层
- 激活层通常紧接在卷积层之后,用于引入非线性因素,使网络能够学习更复杂的特征表示。常见的激活函数包括 ReLU(Rectified Linear Unit)、Sigmoid 和 Tanh 等。
- ReLU 函数因其计算简单、训练速度快且能有效缓解梯度消失问题而被广泛应用,其数学表达式为 f(x)=max(0,x)。当输入 x 大于 0 时,输出为 x;否则输出为 0。
-
池化层
- 池化层的主要作用是对卷积层提取的特征进行降采样,降低特征图的尺寸,从而减少计算量和参数数量,同时提高模型对图像的平移、缩放和旋转等变化的不变性。
- 常见的池化方法有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化是取池化窗口内的最大值作为输出,而平均池化则是取池化窗口内的平均值。例如,使用 2×2 的池化窗口,步长为 2,对大小为 4×4 的特征图进行最大池化后,输出特征图的大小将变为 2×2。
-
全连接层
- 全连接层位于 CNN 的末端,通常用于将前面卷积层和池化层提取到的特征进行整合,并输出最终的分类结果。全连接层中的每个神经元与前一层的所有神经元相连,通过学习权重矩阵和偏置项,将输入特征映射到输出类别空间。
- 例如,在一个图像分类任务中,若输入图像有 10 个类别,则全连接层的输出节点数为 10,每个节点对应一个类别的概率值,通常使用 softmax 函数对输出进行归一化处理,使其表示为概率分布。
三、CNN 的训练过程
-
前向传播
- 前向传播是将输入图像依次通过 CNN 的各个层,计算每一层的输出特征图或向量,直到得到最终的输出结果。在这个过程中,卷积层的卷积核参数、全连接层的权重和偏置等网络参数是预先初始化的,并在训练过程中不断更新优化。
-
损失函数计算
- 损失函数用于衡量模型预测结果与真实标签之间的差异,常见的损失函数有交叉熵损失(Cross-Entropy Loss)、均方误差损失(Mean Squared Error Loss)等。在分类任务中,交叉熵损失函数常被用来衡量预测概率分布与真实标签分布之间的差异,其表达式为:
- L=-1/N∑(yi log yi+(1-yi)log(1-yi))
- 其中,N 为样本数量,yi 为真实标签,yi^ 为模型预测的概率值。
- 损失函数用于衡量模型预测结果与真实标签之间的差异,常见的损失函数有交叉熵损失(Cross-Entropy Loss)、均方误差损失(Mean Squared Error Loss)等。在分类任务中,交叉熵损失函数常被用来衡量预测概率分布与真实标签分布之间的差异,其表达式为:
-
反向传播与参数更新
- 反向传播算法是 CNN 训练的核心,它通过计算损失函数对网络参数的梯度,利用梯度下降法来更新网络参数,从而最小化损失函数。具体来说,从输出层开始,逐层向前计算梯度,并根据学习率调整网络参数。例如,对于卷积层的卷积核参数 W,其更新公式为:
- W=W-η∂L/∂W
- 其中,η 为学习率,∂L/∂W 表示损失函数对卷积核参数的梯度。
- 反向传播算法是 CNN 训练的核心,它通过计算损失函数对网络参数的梯度,利用梯度下降法来更新网络参数,从而最小化损失函数。具体来说,从输出层开始,逐层向前计算梯度,并根据学习率调整网络参数。例如,对于卷积层的卷积核参数 W,其更新公式为:
四、CNN 的应用案例
-
图像分类
- MNIST 手写数字识别是 CNN 在图像分类领域的经典应用之一。MNIST 数据集包含 60000 张训练图像和 10000 张测试图像,每张图像为 28×28 的灰度图像,对应 10 个数字类别(0-9)。通过构建一个简单的 CNN 模型,包括卷积层、激活层、池化层和全连接层,可以实现对 MNIST 手写数字的高效分类,准确率可达 99% 以上。
-
目标检测
- 在目标检测任务中,CNN 可以用于提取图像中的目标特征,并结合区域 proposal 网络(Region Proposal Network,RPN)等技术,实现对图像中目标物体的定位和分类。例如,Faster R-CNN 是一种基于 CNN 的目标检测算法,它通过 RPN 生成候选区域,然后利用 CNN 提取候选区域的特征,并通过全连接层进行分类和回归,从而实现对图像中多个目标的检测和识别。
五、CNN 的优化与改进
-
深度可分离卷积
- 深度可分离卷积是将标准卷积分解为深度卷积(Depthwise Convolution)和逐点卷积(Pointwise Convolution)两步操作,从而减少计算量和参数数量。深度卷积是对每个输入通道单独进行卷积操作,而逐点卷积则是使用 1×1 的卷积核将深度卷积后的特征图进行组合,实现通道间的特征融合。例如,MobileNet 是一种基于深度可分离卷积的轻量级 CNN 架构,它在保证模型性能的同时,大大降低了计算复杂度,适用于移动设备和嵌入式系统。
-
残差网络(ResNet)
- 残差网络通过引入残差连接(Residual Connection)来解决深层网络训练时的梯度消失和梯度爆炸问题。残差连接是将输入直接加到输出上,形成一个残差块,其表达式为:
- F(x)+x
- 其中,F(x) 表示残差块中的卷积操作和激活操作等。这种结构使得网络能够更容易地学习恒等映射,从而加深网络的深度,提高模型的性能。ResNet 在图像分类等任务中取得了显著的性能提升,例如,ResNet-50 模型在 ImageNet 数据集上的分类准确率达到了较高水平。
- 残差网络通过引入残差连接(Residual Connection)来解决深层网络训练时的梯度消失和梯度爆炸问题。残差连接是将输入直接加到输出上,形成一个残差块,其表达式为:
六、实验与代码演示
以下是基于 TensorFlow 框架实现一个简单的 CNN 模型对 MNIST 数据集进行分类的代码示例:
import tensorflow as tf
from tensorflow.keras import datasets, layers, models# 加载 MNIST 数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()# 对数据进行预处理
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255# 构建 CNN 模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))# 测试模型
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\nTest accuracy:', test_acc)
该代码首先加载 MNIST 数据集,并对数据进行预处理,将像素值归一化到 [0,1] 范围。然后构建一个包含三个卷积层、两个池化层和两个全连接层的 CNN 模型,使用 ReLU 激活函数和 softmax 分类器。通过编译模型并指定优化器、损失函数和评估指标,进行模型的训练和测试,输出测试集上的准确率。
七、总结与展望
CNN 在图像处理领域展现了强大的性能,但其应用也存在一些局限,如对数据量要求较高、模型结构复杂导致计算资源消耗大等。未来,随着硬件技术的不断发展和新算法的提出,如更高效的网络架构搜索方法、更精准的特征提取技术等,CNN 将在更多领域发挥更大的作用,为人工智能的发展提供更有力的支持。同时,研究人员也在探索如何将 CNN 与其他技术(如生成对抗网络、Transformer 等)相结合,以进一步提升模型的性能和泛化能力。
相关文章:
机器学习05-CNN
CNN(卷积神经网络)学习文档 一、引言 卷积神经网络(Convolutional Neural Network,CNN)是深度学习中的一种重要网络结构,在图像识别、计算机视觉等领域取得了巨大成功。CNN 的设计灵感来源于生物视觉系统…...
c++ string构造函数和assign函数
c string构造函数和assign函数 #include <iostream> #include <stdlib.h> #include <string> #include <string.h>int main() {char buff[10] {a,b,c,d,e,f,g,h,i,\0};std::string str1;str1.assign(&buff[0],0,10);int length str1.length();i…...
学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、GlitchPass渲染通道)
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.EffectComposer 后期…...
物联网通信协议——TCP与MQTT的对比
在物联网通信中,MQTT和TCP的实现方式和原理完全不同,因为两者属于协议栈的不同层级,解决的问题也不同。以下从协议层级、工作机制和典型场景三个角度详细解释: 1. 协议层级与定位 特性TCPMQTT协议层级传输层(第4层&am…...
docker部署springboot(eureka server)项目
打jar包 使用maven: <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…...
第 7 期:DDPM 采样提速方案:从 DDPM 到 DDIM
本期关键词:采样加速、DDIM 推导、可控性提升、伪逆过程、代码实战 前情回顾:DDPM 的采样瓶颈 在前几期中,我们构建了一个完整的 DDPM 生成流程。但是你可能已经发现: 生成一张图像太慢了!!! 原因是: DDPM 要在 T 个时间步中一步步地去噪,从 x_T → x_0。而通常 T 至…...
1panel第三方应用商店(本地商店)配置和使用
文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境,开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中,供其他用户使用。由此衍生了一种本地应用商店的概念,用户可以自行编写应用配置并上传到自…...
Docker Image export and load and tag
# 在国外服务器保存Docker镜像 docker save myimage > myimage.tar # 将tar文件传输到国内服务器 scp myimage.tar root192.0.2.0:/home # 在国内服务器加载Docker镜像 cd /home docker load < myimage.tar # 查看镜像 docker images #docker 镜像名 tag 为none 的解决方…...
七牛使用任务工作流对音频进行转码
最近工作中有对音频转码的需求,比如 iOS 设备中对 ogg 格式的语音支持力度不够,那么可以讲ogg转码成mp3格式,下面来介绍一下,如果通过七牛,后端自行转码,不需要前端做任何事情。 假设我们存在一个音频的 urlÿ…...
Excel提取图片并自动上传到文件服务器(OOS),获取文件链接
Excel提取图片并自动上传到接口 在实际项目中,我们可能经常会遇到需要批量从Excel文件(.xlsx)中提取图片并上传到特定接口的场景。今天,我就详细介绍一下如何使用Python实现这一功能,本文会手把手教你搭建一个完整的解…...
基于springBoot+vue的PC 端学习系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着我国经济的高速发展与人们生活水平的日益提高,人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下,人们更趋向于足不出户解决生活上的问题,线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时,在疫…...
JVM对象创建全过程
JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤,从类检查到内存分配,再到对象初始化: 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...
Spring Boot 核心注解全解:@SpringBootApplication背后的三剑客
大家好呀!👋 今天我们要聊一个超级重要的Spring Boot话题 - 那个神奇的主类注解SpringBootApplication!很多小伙伴可能每天都在用Spring Boot开发项目,但你真的了解这个注解背后的秘密吗?🤔 别担心&#x…...
【Python爬虫基础篇】--1.基础概念
目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展,万维网成为大量信息的载体…...
CSS进度条带斑马纹动画(有效果图)
效果图 .wxml <view class"tb"><view class"tb-line" style"transform:translateX({{w%}})" /> </view> <button bind:tap"updateLine">增加进度</button>.js Page({data: {w:0,},updateLine(){this.…...
文件二进制读写和文本读写以及编码解码
假如是utf8编码,windows系统 写:往键盘中写的字符会被utf8编码成字节写入文件。假如是文本写,\n会被替换为\r\n写入,结尾会加文件结束符EOF。假如是二进制写,\n就是\n,文件结尾也不会加什么EOF 读ÿ…...
HarmonyOS:使用Refresh组件实现页面下拉刷新上拉加载更多
一、前言 可以进行页面下拉操作并显示刷新动效的容器组件。 说明 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件从API Version 12开始支持与垂直滚动的Swiper和Web的联动。当Swiper设置loop属性为true时&…...
获取印度股票市场列表、查询IPO信息以及通过WebSocket实时接收数据
为了对接印度股票市场,获取市场列表、查询IPO信息、查看涨跌排行榜以及通过WebSocket实时接收数据等步骤。 1. 获取市场列表 首先,您需要获取支持的市场列表,这有助于了解哪些市场可以交易或监控。 请求方法:GETURL:…...
【C++深入系列】:模版详解(上)
🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 你不需要很厉害才能开始,但你需要开始才能很厉害。 ★★★ 本文前置知识: 类和对象(上) …...
leetcode刷题日记——同构字符串
[ 题目描述 ]: [ 思路 ]: 题目要求判断 s 和 t 是否为同构字符串,即 s 中每个字符与 t 中对应位置的字符形成一个映射关系,且只能是一对一映射ASCII(American Standard Code for Information Interchange)…...
HTTP/1.1 队头堵塞问题
文章目录 一、队头堵塞1、非管线化2、管线化 二、如何解决? 一、队头堵塞 1、非管线化 如图,http 请求必须等到上一个请求响应后才能发送,后面的以此类推,由此可以看出,在一个 tcp 通道中,如果某个 http 请…...
【Quest开发】在虚拟世界设置具有遮挡关系的透视窗口
软件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 仅针对urp管线 参考了YY老师这篇,可以先看他的再看这个可能更好理解一些:Unity Meta Quest MR 开发(七):使…...
Qt界面卡住变慢的解决方法
本质原因: 当Qt界面出现卡顿或无响应时,通常是因为主线程(GUI线程)被耗时操作阻塞。 完全忘了。。。 Qt Creater解决方法 1. 定位耗时操作 目标:找到阻塞主线程的代码段。 方法: 使用QElapsedTimer测量代码执行时间…...
常用 Git 命令详解
Git 是一个强大的版本控制工具,广泛用于软件开发和团队协作中。掌握 Git 命令可以帮助开发者更高效地管理代码版本和项目进度。本文将介绍一些常用的 Git 命令,并提供示例以帮助你更好地理解和应用这些命令。 目录 常用命令 git clonegit stashgit pul…...
java导出word含表格并且带图片
背景 我们需要通过 Java 动态导出 Word 文档,基于预定义的 模板文件(如 .docx 格式)。模板中包含 表格,程序需要完成以下操作: 替换模板中的文本(如占位符 ${设备类型} 等)。 替换模板中的图…...
基于CNN卷积神经网络和GEI步态能量提取的视频人物步态识别算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 GEI步态能量提取 4.2 CNN卷积神经网络原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b/matlab2022a 3.部分核心程序 &…...
【Pandas】pandas DataFrame isin
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
算法思想之链表
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之链表 发布时间:2025.4.18 隶属专栏:算法 目录 算法介绍常用技巧 例题两数相加题目链接题目描述算法思路代码实现 两两交换链表中的节点题目链接题目描述算法思路代码实现 重排链表…...
Oceanbase单机版上手示例
本月初Oceanbase单机版发布,作为一个以分布式起家的数据库,原来一个集群动辄小十台机器,多着十几台几十台甚至更多,Oceanbase单机版的发布确实大大降低了硬件部署的门槛。 1.下载安装介质 https://www.oceanbase.com/softwarece…...
架构师面试(三十二):注册中心数据结构
问题 提到【注册中心】,我们对它的基本功能,肯定可以顺手拈来,比如:【服务注册】【服务发现】【健康检查】【变更通知】等。 透过这些基本功能,一个普适的注册中心的数据结构应该如何设计呢? 可以结合着…...
