深度学习 | CNN 基本原理

目录

    • 1 什么是 CNN
    • 2 输入层
    • 3 卷积层
      • 3.1 卷积操作
      • 3.2 Padding 零填充
      • 3.3 处理彩色图像
    • 4 池化层
      • 4.1 池化操作
      • 4.2 池化的平移不变性
    • 5 全连接层
    • 6 输出层


前言

  • 这篇博客不够详细,因为没有介绍卷积操作的具体计算;
  • 但是它介绍了 CNN 各层次的功能,提供了一个全局的视野。

参考博客

  • 卷积神经网络(CNN)详细介绍及其原理详解


1 什么是 CNN

卷积神经网络 CNN 通常被用于图像处理,比如下图的手写数字辨识过程:

在这里插入图片描述

可以看出,整个过程由以下几层组成:

  • 输入层:输入图像等信息;
  • 卷积层:用于提取图像的底层特征;
  • 池化层:防止过拟合,即将数据的维度减小;
  • 全连接层:汇总卷积层和池化层得到的图像的底层特征和信息;
  • 输出层:根据全连接层的信息得到概率最大的结果。

其中最重要的就是卷积层,这也是卷积神经网络名称的由来。接下来,我们将对这些层进行详细的介绍。

个人理解:上图中的红色方框表明,黑色线所指向位置的元素是由红色方框内的元素计算出来的。



2 输入层

CNN 的输入层用于将输入的图像转换为由像素值构成的二维矩阵,并存储该二维矩阵以等待后续操作。与人眼不同,计算机能够处理的图像是一个二维矩阵,该二维矩阵是由图像的每一个像素的像素值组成的。如下图所示,手写数字 8 8 8 的图像被计算机读取为一个二维矩阵:

在这里插入图片描述
图 (a) 是一个灰度图像,这是因为其每个像素值的范围在 [ 0 , 255 ] [0,255] [0,255] 之间,表示其颜色的强弱程度。除灰度图像外还有黑白图像,黑白图像的每个像素值要么是 0 0 0,要么是 255 255 255。而日常生活中最常见的是 R G B \mathrm{RGB} RGB 图像,这种图像有三个通道,分别是:红色、绿色、蓝色。每个通道的每个像素值的范围也是在 [ 0 , 255 ] [0,255] [0,255] 之间,表示其颜色的强弱程度。

由于灰度图像的值范围较小、颜色较单一,因此比较好操作,所以我们通常处理的都是灰度图像。在某些情况下, R G B \mathrm{RGB} RGB 图像在输入神经网络之前也会被转化为灰度图像,这就是因为处理三个通道的计算量非常大。不过随着计算机性能的高速发展,现在有些神经网络也可以直接处理 R G B \mathrm{RGB} RGB 图像。



3 卷积层

一旦图片被输入网络,它将被转换成一个二维矩阵。为了提取该矩阵中的特征,卷积操作被应用于该矩阵。该操作通过计算每个像素与卷积核(Convolution Kernel)的点积,为图像中具有特征的区域赋予高值,为不具有特征的区域赋予低值。

注意:想要提取什么样的特征,就要使用什么样的卷积核。比如:想要提取原始图像中眼睛这一特征,就要使用具有眼睛特征的卷积核。

3.1 卷积操作

卷积核本质上也是一个二维矩阵,其尺寸通常小于或等于输入图像的二维矩阵。在卷积操作中,卷积核在输入图像矩阵上逐像素移动,并在每次移动后执行像素值的点积运算。将所有这些点积的和赋予当前卷积核位置对应的输出矩阵中的相应像素值。如下图所示:

在这里插入图片描述

通过卷积核不断地移动和计算(逐元素相乘再相加),我们得到了一个新的二维矩阵,该二维矩阵被称为特征图(Feature Map),也就是图像中最有用的特征。此外,不难看出卷积操作是一个降维的过程,因为特征图的维度比原始图像的二维矩阵小。

在上图中,红色矩阵是图像的二维矩阵,蓝色矩阵是卷积核,紫色矩阵是特征图。

为了进行更加生动形象的说明,我们以提取人脸图像中的眼睛为例,选取眼睛作为卷积核,并在整个头部图像上移动,以识别和定位眼睛的位置。如下图 (a)(b)(c) 所示:

在这里插入图片描述

为了强调我们提取到的人眼特征,我们可以假设高值为白色,低值为黑色,并对特征图进行上色处理,如上图 (d) 所示。说明:由于黑色实在是太辣眼睛了,因此我实际上用的是灰色。

由向量乘法的几何意义可知,两个向量越相似,其乘积结果越大。因此当卷积核移动到眼睛部分时,它们的卷积结果较大,即上图中的 100 100 100



3.2 Padding 零填充

可以从上一节的动图看出,边缘的像素只被计算了一次,而中间的像素被计算了多次,从而造成了边缘特征的丢失。为了克服这一问题,通常在原始输入图像的二维矩阵周围添加额外的边缘像素,即进行零填充(Padding)。如此一来,每个像素都能够获得相同的计算机会,确保了特征图不会丢失边缘区域的重要特征。

P a d d i n g = 1 \mathrm{Padding = 1} Padding=1,即扩展 1 1 1

在这里插入图片描述

P a d d i n g = 2 \mathrm{Padding = 2} Padding=2,即扩展 2 2 2

在这里插入图片描述

注意:上面两张动图中,蓝色矩阵是图像的二维矩阵,透明灰色矩阵是卷积核,绿色矩阵是特征图。



3.3 处理彩色图像

已知每张彩色图像都有三个通道,即三个二维矩阵。假设我们使用两组卷积核来提取图像特征,如下图所示:

在这里插入图片描述

其中一组卷积核对应提取出一个特征图,每组中的一个卷积核对应提取一个通道的特征。不难看出,有多少组卷积核就会有多少个特征图。特征图中的一个元素,等于三个通道的卷积结果之和,再加上偏置项。比如:上图中的 1 1 1 等于 1 + ( − 1 ) + 0 + 1 1+(-1)+0+1 1+(1)+0+1。偏置项 b i a s \mathrm{bias} bias 就是每组最后的那个 1 × 1 1\times 1 1×1 矩阵。

注意:特征图的个数等于卷积核的组数,而不是卷积核的个数!



4 池化层

在上一节中,我们讲到有多少组卷积核就会有多少个特征图。但是随着特征图的增多,我们必须考虑一个重要的问题:并非所有的特征图都是必需的。而且多余的特征图可能会带来如下两个问题:

  • 过拟合
  • 维度过高

为了解决这个问题,我们使用了池化层。

4.1 池化操作

池化层又称为下采样,其作用在于在卷积操作之后对特征图进行降维,通过提取最显著的特征信息来减少数据量,从而起到减小过拟合和降低维度的作用。

池化过程类似于卷积过程,也是让一个固定大小的窗口在图片上进行移动,每次我们选取窗口内最具代表性的特征。那么如何提取出最具代表性的特征呢?通常有以下两种方法。

最大池化

最大池化是指每次选取窗口内所有值的最大值,认为这个最大值就是当前位置最具代表性的特征。该过程如下图所示:
在这里插入图片描述
参数说明:

  • k e r n e l − s i z e = 2 \mathrm{kernel_{-}size} = 2 kernelsize=2:是指窗口的维度为 2 × 2 2\times2 2×2
  • s t r i d e = 2 \mathrm{stride} = 2 stride=2:是指窗口每次移动两格位置;
  • p a d d i n g = 0 \mathrm{padding} = 0 padding=0:是指零填充的圈数,如果值为 0 0 0 则表明没有扩展。

平均池化

平均池化是指每次选取窗口内所有值的平均值,即考虑了每个位置的值对该位置特征的影响。该过程如下图所示:

在这里插入图片描述
池化层的优点总结如下:

  • 减少参数量的同时保留图像的原始特征;
  • 有效地防止过拟合;
  • 为 CNN 带来平移不变性;

前两个优点我们之前已经介绍过了,那么什么又是平移不变性呢?



4.2 池化的平移不变性

如图 (a) 所示,两张图片的内容都是人脸,但是下图的人脸稍稍左移了一点。如图 (b) 所示,经过卷积操作后得到各自的特征图。

在这里插入图片描述

其中上图的眼睛特征的位置正常,下图的眼睛特征的位置稍稍左移了一点。尽管人类能够识别出眼睛的位置,但是当通过神经网络进行计算时,可能会引入误差,原因是网络未能在预期位置上正确地识别出眼睛。针对这种情况,应当采取何种措施呢?

如图 (c) 所示,使用池化层执行池化处理后,观察到尽管在池化前两张图像的眼睛特征位于不同位置,但经过池化处理后,这些特征的位置均统一。这极大地便利了后续神经网络的计算,并且体现了池化操作的平移不变性。



5 全连接层

假设在上述头部图像示例中,我们已经通过卷积操作和池化操作提取了眼睛、鼻子和嘴巴的特征。若要利用这些特征来判断图像是否为人体头部,需要对所有提取出的特征图进行 “展平” 操作,即将其维度转换为 1 × n 1\times n 1×n 的形式,该过程被称为全连接。如下图所示:

在这里插入图片描述

也就是说,全连接层将提取出的特征图展开成一维向量。随后通过计算产生一个概率值,该值表示原始图像是人体头部图像的概率。

个人理解:上图中每个特征图的维度是 5 × 5 5\times 5 5×5,展开成一维向量后的维度是 1 × 25 1\times 25 1×25,拼接起来送入神经元时的维度是 1 × 75 1\times 75 1×75



6 输出层

输出层用于对全连接层输出的一维向量进行计算,如下图所示:

在这里插入图片描述

其中的计算可能是线性的,也可能是非线性的。在深度学习中,鉴于通常需要处理多分类任务,输出层每个位置都会产生一个概率值,代表属于当前位置对应类别的概率。选择概率值最大的类别作为最终的识别结果。在训练过程中,通过不断调整网络的参数,提高识别的准确率。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包,可以帮助我们进行A…

[杂谈] 关于 Mac 电脑使用 Logitech 鼠标导致 Vscode 侧键无法进行代码前进、回退的问题

我个人使用的是一台 14 寸的 Mac_Apple_M1,外接键盘显示器罗技的 MX Master 3 for Mac 的鼠标。 之前一直使用的 GoLand 开发,查看代码时进行代码跳转就很方便,滚轮键 进入函数方法,鼠标侧键进行前进、后退。看代码完全可以右手单…

【大模型入门】LLM-AI大模型介绍

大语言模型 (LLM) 背景 🍹大语言模型 (Large Language Model) 是一种人工智能模型, 它们通常包含数千亿甚至更多的参数,并在大规模数据集上进行训练。大语言模型可以处理多种自然语言任务,如文本分类、问答、翻译、对话等等。 自然语言模型…

qt explicit 啥意思

explicit 在 Qt 和 C 中是一个关键字,主要用于修饰类的构造函数。其含义和用法可以归纳为以下几点: 意义: explicit 英文直译为“明确的”、“显式的”。在 C 中,当一个构造函数只接受一个参数时,它可能会被编译器用于…

【Nail it】ROS1 ROS2 通信(ros2/ros1_bridge)

情况说明:目标是实现ros2容器和ros1主机的通信,可以起一个ros1容器作为桥梁(若是在一个主机同时包含ros1&ros2,配置更加方便). 1.起一个 noetic 的容器 docker run -it --network host --name my_bridge ros:noe…

Java中的成员内部类

Java中的成员内部类(也称为非静态内部类)是定义在另一个类(外部类)内部的类。 这种内部类与它的外部类之间有着紧密的联系,主要体现在几个方面:它可以访问外部类的所有成员(包括私有成员&#…

C++小白Python选手2小时入门C++

学习链接:C入门/2小时从C到C快速入门(2018,C教程) C在C语言的基础上增加了面向对象和通用算法语言特征。 C头文件不必是.h结尾,C头文件举例:cmath、cstdio注释:单行//、多行/**/为了防止名字冲…

MQ基础1

对应B站视频: MQ入门-01.MQ课程介绍_哔哩哔哩_bilibili 微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后…

【JavaScript脚本宇宙】强大的自然语言处理:六款JavaScript库详解

从语义到实体:深入了解JavaScript自然语言处理库 前言 随着人工智能和自然语言处理技术的飞速发展,JavaScript在这一领域也有了越来越多的应用。本文将介绍几个优秀的JavaScript库,它们专注于处理英语文本,并提供了丰富的功能和…

求立方体面积体积以及判断(c++)

代码&#xff1a; #include<iostream> using namespace std;class Cube { public:void setL(int l){m_L l;}int getL(){return m_L;}void setW(int w){m_W w;}int getW(){return m_W;}void setH(int h){m_H h;}int getH(){return m_H;}int calculateS(){return 2 * (…

netdata 监控软件安装与学习

netdata官网 netdata操作文档 前言&#xff1a; netdata是一款监控软件&#xff0c;可以监控多台主机也可以监控单台主机&#xff0c;监控单台主机时&#xff0c;开箱即用&#xff0c;web ui很棒。 环境&#xff1a; [root192 ~]# cat /etc/system-release CentOS Linux rel…

彻底清理Conda环境:使用conda remove命令的终极指南

彻底清理Conda环境&#xff1a;使用conda remove命令的终极指南 在Conda环境中&#xff0c;随着时间的推移&#xff0c;可能会积累大量不再需要的包和它们的依赖项。这不仅会占用宝贵的磁盘空间&#xff0c;还可能影响环境的性能。conda remove命令是Conda提供的一个强大工具&…

GD32F407VET6新建固件库工程并下载运行

零、所需文件及环境&#xff1a; 1、固件库的压缩包 GD32F4xx_Firmware_Library_V3.2.0.7z 官网 2、GD32F407的keil支持包 官网 兆易创新GigaDevice-资料下载兆易创新GD32 MCU 2、 keilkilll.bat 用来删除编译过程文件 可以不要 &#xff08;原子、野火资料里都有&…

LeetCode热题100(JavaScript)

哈希 两数之和 暴力解法 /*** param {number[]} nums* param {number} target* return {number[]}*/ var twoSum function(nums, target) {for(let i 0;i<nums.length;i){let x1 nums[i]for(let j 0 ; j<nums.length;j){if(i!j){let x2 nums[j]if(x1x2target){ret…

算法金 | 来了,pandas 2.0

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今日 210/10000 Pandas 是一个强大的数据分析库&#xff0c;广泛应用于科学研究、金融分析、商业智能等领域。它提供了高效的数据结构…

[WUSTCTF2020]level4题解 入土为安的第三天

二叉树 Practice my Data Structure code..... Typing....Struct.....char....*left....*right............emmmmm...OK! Traversal! Traversal type 1:2f0t02T{hcsiI_SwA__r7Ee} Traversal type 2:20f0Th{2tsIS_icArE}e7__w Traversal type 3: //type3(&x[22]); No w…

samba服务、安装-smbpasswd工具、pdbedit工具、testparm工具

在Windows构建的网络生态里&#xff0c;各主机间的文件及打印资源共享&#xff0c;主要依赖微软专有的SMB/CIFS网络协议来达成。SMB&#xff08;即Server Message Block&#xff0c;服务消息块&#xff09;与CIFS&#xff08;全称Common Internet File System&#xff0c;通用互…

ShardingSphere的项目应用

1. 事情的起因 最近,随着业务的发展,我们的项目面临着日益增长的数据挑战。系统使用的数据库是mysql,每天的增量差不多在百万左右,由于没有进行分库分表,以前设置的单表保存已经越发不能满足需求,所以想维持表的性能,甲方考虑对这些大数据量的表进行分表操作,同时也采…

MySQL left join、right join以及inner join的区别 ?

LEFT JOIN&#xff08;左连接&#xff09;、RIGHT JOIN&#xff08;右连接&#xff09;和INNER JOIN&#xff08;内连接&#xff09;是SQL中用于连接两个或多个表以检索数据的重要操作。它们之间的主要区别在于如何处理那些在连接条件下没有匹配的行。下面通过具体的例子来说明…

扫地机器人如何解决安全性与隐私保护

扫地机器人在解决安全性与隐私保护方面&#xff0c;需要从多个角度入手&#xff0c;包括产品设计、技术实现、用户教育以及法律法规遵守等方面。以下是具体的解决方案&#xff1a; 一、安全性解决方案 1.提升避障能力&#xff1a;使用先进的传感器技术&#xff0c;如激光雷达、…