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

深度学习入门-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的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…...

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

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

centos 7 Mysql服务

将此服务器配置为 MySQL 服务器&#xff0c;创建数据库为 hubeidatabase&#xff0c;将登录的root密码设置为Qwer1234。在库中创建表为 mytable&#xff0c;在表中创建 2 个用户&#xff0c;分别为&#xff08;xiaoming&#xff0c;2010-4-1&#xff0c;女&#xff0c;male&…...

React 表单处理与网络请求封装详解[特殊字符][特殊字符]

在 React 开发中&#xff0c;表单处理和网络请求是非常常见的需求。本文将围绕以下几个方面展开讲解&#xff1a; FormItem 绑定 name 属性表单校验与失焦校验获取表单数据封装请求模块 request 1. FormItem 绑定 name 属性 在 React 中&#xff0c;使用 Ant Design 的 Form …...

C++ 的 CTAD 与推断指示(Deduction Guides)

1 类模板参数推导&#xff08;CTAD&#xff09; 1.1 曲线救国 ​ CTAD 的全称是类模板参数推导&#xff08;Class Template Argument Deduction&#xff09;&#xff0c;它允许在实例化类模板时&#xff0c;根据构造函数的参数类型自动推导模板参数&#xff0c;从而避免显式指…...

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…...

如何将原来使用cmakelist编译的qt工程转换为可使用Visual Studio编译的项目

将原来使用CMakeLists.txt编译的Qt工程转换为可使用Visual Studio编译的项目&#xff0c;可以通过以下步骤实现&#xff1a; 一、准备阶段 安装必要的软件&#xff1a; 确保已安装Visual Studio&#xff0c;并选择了C开发相关的组件。安装CMake&#xff0c;并确保其版本与Qt和…...

微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜

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

Ubuntu、Windows系统网络设置(ping通内外网)

一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种&#xff1a; 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意&#xff1a; 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…...

华为OD机试E卷 ---最大值

一、题目描述 给定一组整数(非负)&#xff0c;重排顺序后输出一个最大的整数。 二、示例1 用例1 输入 10 9输出 910说明:输出结果可能非常大&#xff0c;所以你需要返回一个 字符串只而不是整数。 三、输入描述 数字组合 四、输出描述 最大的整数 五、解题思路 字符…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...