深度学习入门-CNN
一、CNN是什么
CNN,即卷积神经网络(convolutional neural network),是用于预测的标准神经网络架构。在人工智能的广阔领域中,CNN被用于图像识别、语音识别等各种场合,CNN通过模拟人类视觉皮层的神经元连接方式,能够自动提取图像中的特征,从而实现对图像的高效理解和处理 。
二、CNN的基本原理
1. 卷积操作
卷积操作是CNN的核心运算,它通过在输入数据上滑动一个滤波器(或称为卷积核)来提取局部特征。卷积核是一个小型的权重矩阵,它与输入数据的局部区域进行逐元素相乘并求和,生成一个特征图(Feature Map)。这一过程可以形象地理解为用一个“小窗口”在图像上滑动,每次只关注窗口内的内容,并将其转换为一个特征值。卷积操作能够有效地捕捉图像中的局部模式,如边缘、纹理和形状等,且具有参数共享和稀疏连接的特点,大大减少了模型的参数数量,提高了计算效率。
2. 池化操作
池化(Pooling)操作通常紧跟在卷积层之后,其目的是降低特征图的空间维度,减少计算量和参数数量,同时保留重要的特征信息。常见的池化方法有最大池化(Max Pooling)和平均池化(Average Pooling)。最大池化取局部区域内的最大值作为输出,能够突出显著特征;平均池化则取局部区域内的平均值,相对较为平滑。池化操作不仅能够减少数据的维度,还能提供一定程度的平移不变性,使模型对输入数据的小范围平移具有鲁棒性。
3. 激活函数
激活函数为CNN引入了非线性因素,使得网络能够学习和模拟复杂的函数映射关系。常用的激活函数有ReLU(Rectified Linear Unit)、Sigmoid和Tanh等。ReLU函数因其计算简单、能够有效缓解梯度消失问题而在CNN中广泛使用,其表达式为f(x) = max(0, x)。Sigmoid函数和Tanh函数则能够将输入数据映射到(0, 1)和(-1, 1)的范围内,适用于需要将数据归一化的场景,但在深层网络中可能会导致梯度消失问题。
-
ReLU(Rectified Linear Unit)
f(x) = max(0, x)
,计算简单,能够有效缓解梯度消失问题,是CNN中常用的激活函数。
-
Sigmoid
f(x) = 1 / (1 + exp(-x))
,将输入数据映射到(0, 1)的范围内,适用于需要将数据归一化的场景,但在深层网络中可能会导致梯度消失问题。
-
Tanh
f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))
,将输入数据映射到(-1, 1)的范围内,相对Sigmoid函数更加对称,但在深层网络中也可能会导致梯度消失问题。
三、CNN的构成
1. 输入层(Input Layer)
输入层是CNN接收数据的入口,其主要作用是将原始数据(如图像)传递给后续的网络层。对于图像数据,输入层通常包含多个通道,分别对应图像的红、绿、蓝(RGB)颜色通道。输入层的尺寸取决于图像的分辨率,例如,对于一张224x224像素的RGB图像,输入层的尺寸为224x224x3。
2. 卷积层(Convolutional Layer)
卷积层是CNN中实现特征提取的关键层,通过卷积操作将输入数据转换为特征图。每个卷积层包含多个卷积核,每个卷积核负责提取一种特定的特征。卷积层的输出特征图数量等于卷积核的数量。卷积层可以有多个,随着网络的加深,卷积层提取的特征从低级的边缘、纹理逐渐转变为高级的语义信息。
-
卷积核(Filter)
卷积核的大小(如3x3、5x5)和数量决定了卷积层的特征提取能力。每个卷积核提取一种特定的特征,如边缘、纹理或形状。
-
步长(Stride)
步长决定了卷积核在输入数据上移动的步长。步长为1表示每次移动一个像素,步长为2表示每次移动两个像素,依此类推。较大的步长可以减少特征图的尺寸,但可能会丢失一些细节信息。
-
填充(Padding)
填充用于在输入数据的边缘添加零值,以保持特征图的尺寸。常用的填充方式有“valid”(不填充)和“same”(保持特征图尺寸不变)。
3. 池化层(Pooling Layer)
池化层用于降低特征图的空间维度,减少计算量和参数数量,同时保留重要特征。池化层通常紧跟在卷积层之后,对卷积层输出的特征图进行下采样。池化操作可以是最大池化或平均池化,步长和池化窗口大小是池化层的两个重要参数。步长决定了池化窗口移动的步长,池化窗口大小决定了每次池化操作的范围。
-
最大池化(Max Pooling)
取局部区域内的最大值作为输出,能够突出显著特征。
-
平均池化(Average Pooling)
取局部区域内的平均值,相对较为平滑。
-
池化窗口大小(Pool Size)
池化窗口的大小决定了每次池化操作的范围。常用的池化窗口大小为2x2。
-
步长(Stride)
池化操作的步长决定了池化窗口移动的步长。通常,池化窗口的步长等于池化窗口的大小,以避免重叠。
4. 全连接层(Fully Connected Layer)
全连接层是CNN中实现分类或回归的关键层,其输入是卷积层和池化层提取的特征图,输出是最终的预测结果。全连接层的神经元与前一层的特征图中的所有神经元相连,通过学习权重矩阵将特征图转换为预测输出。在分类任务中,全连接层的输出神经元数量通常与类别数量相等;在回归任务中,全连接层通常只有一个输出神经元。全连接层的权重矩阵是通过反向传播算法学习得到的,其目的是最小化预测输出与真实标签之间的差异。
-
输入特征
全连接层的输入特征是卷积层和池化层提取的特征图,通常需要将特征图展平为一维向量。
-
输出神经元
在分类任务中,全连接层的输出神经元数量通常与类别数量相等;在回归任务中,全连接层通常只有一个输出神经元。
-
权重矩阵
全连接层的权重矩阵是通过反向传播算法学习得到的,其目的是最小化预测输出与真实标签之间的差异。
四、CNN的训练过程
1. 前向传播(Forward Propagation)
前向传播是CNN训练过程中的第一步,其目的是计算网络的预测输出。在前向传播过程中,输入数据依次通过输入层、卷积层、池化层和全连接层,最终得到预测输出。每个卷积层通过卷积操作提取特征图,每个池化层对特征图进行下采样,全连接层将特征图转换为预测输出。前向传播过程可以表示为一系列矩阵运算和非线性变换,其计算效率较高,适用于大规模数据的处理。
2. 损失函数(Loss Function)
损失函数用于衡量网络预测输出与真实标签之间的差异,是训练CNN的优化目标。常见的损失函数有均方误差损失(Mean Squared Error,MSE)和交叉熵损失(Cross-Entropy Loss)。均方误差损失适用于回归任务,其计算预测输出与真实标签之间的平方差的均值;交叉熵损失适用于分类任务,其计算预测概率分布与真实概率分布之间的交叉熵。损失函数的值越小,表示网络的预测输出越接近真实标签,模型的性能越好。
3. 反向传播(Backward Propagation)
反向传播是CNN训练过程中的关键步骤,其目的是通过计算损失函数对网络权重的梯度,更新网络权重,使损失函数的值最小化。在反向传播过程中,首先计算损失函数对预测输出的梯度,然后依次计算全连接层、池化层和卷积层的权重梯度。每个层的权重梯度通过链式法则计算得到,其计算过程涉及矩阵运算和导数计算。反向传播过程的核心是梯度下降算法,其通过迭代更新网络权重,使损失函数的值逐渐减小,最终使网络收敛到最优解。
4. 优化算法(Optimization Algorithm)
优化算法用于更新网络权重,使损失函数的值最小化。常见的优化算法有随机梯度下降(Stochastic Gradient Descent,SGD)、动量优化算法(Momentum)、Adagrad、RMSprop和Adam等。SGD是最基本的优化算法,其通过计算损失函数对网络权重的梯度,更新网络权重;动量优化算法在SGD的基础上引入了动量项,能够加速收敛并减少震荡;Adagrad、RMSprop和Adam等优化算法则通过自适应调整学习率,提高了优化过程的效率和稳定性。优化算法的选择对CNN的训练效果和收敛速度有重要影响,需要根据具体任务和数据集进行选择。
五、CNN的实际应用
1. 图像分类
图像分类是CNN最经典的应用之一,其目的是将输入图像划分到预定义的类别中。例如,ImageNet Large Scale Visual Recognition Challenge(ILSVRC)是一个大规模的图像分类竞赛,参赛者需要将输入图像分类到1000个不同的类别中。CNN在这一任务中取得了显著的性能提升,超越了传统的图像分类方法。通过构建深层的CNN架构,如AlexNet、VGGNet、GoogLeNet和ResNet等,研究者们实现了对大规模图像数据的高效分类,推动了图像识别技术的发展。
2. 目标检测
目标检测是图像识别领域的另一个重要任务,其目的是在图像中定位和识别多个目标对象。CNN在目标检测中也发挥了重要作用,通过结合区域提议(Region Proposal)和分类器,实现了对图像中目标对象的准确定位和分类。例如,R-CNN(Region-based Convolutional Neural Networks)、Fast R-CNN和Faster R-CNN等算法通过使用CNN提取图像特征,结合区域提议网络(Region Proposal Network,RPN)生成候选区域,实现了对图像中目标对象的高效检测。这些算法在PASCAL VOC、COCO等目标检测数据集上取得了优异的性能,推动了目标检测技术的发展。
3. 语义分割
语义分割是图像识别领域的高级任务,其目的是将图像中的每个像素划分到预定义的类别中。与图像分类和目标检测不同,语义分割需要对图像进行像素级的分类,因此对模型的精度和鲁棒性要求更高。CNN在语义分割中也取得了显著的成果,通过结合全卷积网络(Fully Convolutional Networks,FCN)、U-Net等架构,实现了对图像的高效语义分割。这些架构通过使用卷积层和上采样层,将图像中的每个像素映射到对应的类别,实现了对图像的精细分割。语义分割技术在医学图像分析上发挥了很大的作用。
本文参考书籍:
《深度学习入门:基于python的理论与实现》
《Python深度学习入门:从零构建CNN和RNN》
本文仅为个人学习使用所写。
本文有AI成分。
相关文章:
深度学习入门-CNN
一、CNN是什么 CNN,即卷积神经网络(convolutional neural network),是用于预测的标准神经网络架构。在人工智能的广阔领域中,CNN被用于图像识别、语音识别等各种场合,CNN通过模拟人类视觉皮层的神经元连接方…...

微服务网关,如何选择?
什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…...
SpringBoot集成Mqtt服务实现消费发布和接收消费
该项目介绍了docker环境下如何安装mqtt和springboot集成mqtt服务 前述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,设计用于在资源受限的设备和低带宽、不可靠的网络连接中高效地传输数据。主要用于物联网设备传输,设备之间可以高效地交换数据…...

在Mac mini上实现本地话部署AI和知识库
在Mac mini上实现本地话部署AI和知识库 硬件要求:大模型AI,也叫LLM,需要硬件支持,常见的方式有2种:一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片;第二种是采用苹果M系列芯片架构的支持统一内存架…...
一个方法被多个线程同时调用,确保同样参数的调用只能有一个线程执行,不同参数的调用则可以多个线程同时执行
我们知道通过lock一个固定静态object给代码段加同步锁,可以让多个线程的同时调用以同步执行,因此可以利用字典来给不同参数分配不同的静态对象,方法中不同的参数调用锁住各自不同的静态对象即可实现不同参数不加锁,相同参数才加锁…...

3. MySQL事务并发的问题与解决方法
一. 并发事务带来的问题 并发会造成事务间出现脏读,不可重复读,幻读现象。 1. 脏读 一个事务在处理过程中读取了另外一个事务未提交的数据。若另外一个事务回滚,则读取到的数据是无效的,又称为脏读。 2. 不可重复读 在一个事务…...

25/1/15 嵌入式笔记 初学STM32F108
GPIO初始化函数 GPIO_Ini:初始化GPIO引脚的模式,速度和引脚号 GPIO_Init(GPIOA, &GPIO_InitStruct); // 初始化GPIOA的引脚0 GPIO输出控制函数 GPIO_SetBits:将指定的GPIO引脚设置为高电平 GPIO_SetBits(GPIOA, GPIO_Pin_0); // 将GPIO…...
MySQL的不同SQL模式导致行为不同?
现象: 我在两个mysql库都有相同定义的表,其中一个字段是varchar(1200)。当我都对这个表进行insert操作,而且超过此字段的规定长度(此处是1200),这两库的行为是不一样的:库B是直接报错too long&…...
Flink 使用 Kafka 作为数据源时遇到了偏移量提交失败的问题
具体的错误日志 21:43:57.069 [Kafka Fetcher for Source: Custom Source -> Map -> Filter (1/1)#2] ERROR org.apache.kafka.clients.consumer.internals.ConsumerCoordinator - [Consumer clientIdconsumer-my-group-6, groupIdmy-group] Offset commit failed on pa…...

【日志篇】(7.6) ❀ 01. 在macOS下刷新FortiAnalyzer固件 ❀ FortiAnalyzer 日志分析
【简介】FortiAnalyzer 是 Fortinet Security Fabric 安全架构的基础,提供集中日志记录和分析,以及端到端可见性。因此,分析师可以更有效地管理安全状态,将安全流程自动化,并快速响应威胁。具有分析和自动化功能的集成…...

LSA更新、撤销
LSA的新旧判断: 1.seq,值越大越优先 2.chksum,值越大越优先 3.age,本地的LSA age和收到的LSA age作比较 如果差值<900s,认为age一致,保留本地的:我本地有一条LSA是100 你给的是400 差值小于…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…...

centos 7 Mysql服务
将此服务器配置为 MySQL 服务器,创建数据库为 hubeidatabase,将登录的root密码设置为Qwer1234。在库中创建表为 mytable,在表中创建 2 个用户,分别为(xiaoming,2010-4-1,女,male&…...
React 表单处理与网络请求封装详解[特殊字符][特殊字符]
在 React 开发中,表单处理和网络请求是非常常见的需求。本文将围绕以下几个方面展开讲解: FormItem 绑定 name 属性表单校验与失焦校验获取表单数据封装请求模块 request 1. FormItem 绑定 name 属性 在 React 中,使用 Ant Design 的 Form …...
C++ 的 CTAD 与推断指示(Deduction Guides)
1 类模板参数推导(CTAD) 1.1 曲线救国 CTAD 的全称是类模板参数推导(Class Template Argument Deduction),它允许在实例化类模板时,根据构造函数的参数类型自动推导模板参数,从而避免显式指…...

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注
13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发,而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中,我们会讨论 Rust 的一…...
如何将原来使用cmakelist编译的qt工程转换为可使用Visual Studio编译的项目
将原来使用CMakeLists.txt编译的Qt工程转换为可使用Visual Studio编译的项目,可以通过以下步骤实现: 一、准备阶段 安装必要的软件: 确保已安装Visual Studio,并选择了C开发相关的组件。安装CMake,并确保其版本与Qt和…...

微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜
快科技1月17日消息,微软澄清了关于Windows 10停止支持后Microsoft 365办公套件使用情况的误解。 前两天微软更新支持文档,表示2025年10月14日Windows 10停止支持之后,Microsoft 365应用程序将不再支持Windows 10设备,引发用户担忧…...

Ubuntu、Windows系统网络设置(ping通内外网)
一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种: 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意: 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…...
华为OD机试E卷 ---最大值
一、题目描述 给定一组整数(非负),重排顺序后输出一个最大的整数。 二、示例1 用例1 输入 10 9输出 910说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。 三、输入描述 数字组合 四、输出描述 最大的整数 五、解题思路 字符…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

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

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...