目录
图像原理
何为卷积神经网络CNN?
CNN中的基本概念
1.卷积(Convolution)
2.Padding
3.stride
4.池化
5.Shape
6.激活函数
CNN整体结构
CNN的优势
首页 科技周边 人工智能 零基础也能搞懂卷积神经网络原理!超详细!

零基础也能搞懂卷积神经网络原理!超详细!

Jun 04, 2024 pm 08:19 PM
ai 神经网络

相信和作者一样爱技术对AI兴趣浓厚的小伙伴们,一定对卷积神经网络并不陌生, 也一定曾经对如此“高级”的名字困惑良久。作者今天将从零开始走进卷积神经网络的世界~与大家分享!

在深入了解卷积神经网络之前,我们先看看图像的原理。

零基础也能搞懂卷积神经网络原理!超详细!

图像原理

图像在计算机中是通过数字(0-255)来表示的,每个数字代表图像中一个像素的亮度或颜色信息。其中:

  • 黑白图像:每个像素只有一个值,这个值在0(黑色)到255(白色)之间变化。

零基础也能搞懂卷积神经网络原理!超详细!

  • 彩色图像:每个像素包含三个值,最常见的是RGB(Red-Green-Blue)模型,即红色、绿色和蓝色光以不同强度组合起来产生各种颜色。每个颜色通道都有256级亮度,从0~255,因此每种颜色可以用一个8位的二进制数来表述,例如(255,0,0)表示红色,(0,255,0)表示绿色,(0,0,255)表示蓝色,其他组合则对应各种颜色。计算机中,彩色图像的数据结构通常是一个三维数组或张量,形状为(宽度,高度,深度),其中深度就是通道的数量,对于RGB图像来说,深度是3。这意味着,对于每个像素位置,有三个数值分别代表红绿蓝三个通道的亮度。例如,一个100*100像素的RGB图像将占用100x100x3个字节的内存。

零基础也能搞懂卷积神经网络原理!超详细!

「这里“8位的二进制数”怎么理解呢?」

在RGB颜色模型中,每个颜色通道(红、绿、蓝)可以有256个不同的亮度级别,每个通道表示8位二进制表示,8位二进制数的最大值是11111111,转化成十进制就是255;最小值是00000000,转化成十进制就是0。

何为卷积神经网络CNN?

CNN报道了一种在CV中家喻户晓的一种应用场景。以原始图片尺寸为10x10为例,如下图所示,其左半部分是像素值较大,是明亮区域;右半部分是像素值较小,为深度区域。中间的分界线即是要检测的边缘。

「那么怎么检测边缘呢?」 此时滤波器filter(也叫kernel)出场了,如下图所示,kernel尺寸为3x3。

滤波器filter滑过输入图片,在每个区域处稍做停留,对应元素相乘再相加计算,之后再向其它区域滑动继续计算,直到滑动至原图片的最后一个区域为止。这个过程即为「卷积。」

零基础也能搞懂卷积神经网络原理!超详细!

由上图可以看出,输出结果的中间颜色浅,两边颜色深,说明原图的边界已反应出来。「因此可以总结出,边缘检测就是通过输入图片与相应滤波器进行卷积运算得以识别。」

另外,这里的滑动还涉及到一个基本概念,「步长stride」,上述示例中,是以stride为1说明,每次滑动一格,共停留了8x8个区域,所以最终输出结果是8x8矩阵。

「那么,究竟什么是卷积神经网络呢?」

经过上面边缘检测这一具体的目标检测场景的分析,我们也就不难理解,CNN(Convolutional neural network)就是通过各种各样的滤波器filter不断提取图片特征,从局部到整体,进而识别目标。

而在神经网络中,这些filter中的每个数字,就是参数,可通过大量数据训练得到(即深度学习的过程)。

CNN中的基本概念

1.卷积(Convolution)

(1) 卷积计算

卷积是数学分析中的一种积分变换的方法,而在图像处理中则采用的是卷积的离散形式。在卷积神经网络CNN中,卷积层的实现方式本质即为数学中定义的互相关计算(cross-correlation)。具体计算过程如下图所示。

零基础也能搞懂卷积神经网络原理!超详细!

其中:

图(a):左边的图大小是3×3,表示输入数据是一个维度为3×3的二维数组;中间的图大小是2×2,表示一个维度为 2×2的二维数组,也即为「卷积核」。卷积核的左上角与输入数据的左上角(0,0)对齐,并依次将二者对应位置数据相乘,再相加,即可获得卷积输出的第一个结果25。

依次类推,图(b)、(c)、(d)分别为卷积输出的第二、三、四个输出结果。

(2) 图片卷积运算

那么图片卷积运算,具体是怎么回事呢?如下图所示即为彩色图像卷积过程。

零基础也能搞懂卷积神经网络原理!超详细!

对于彩色图像的通道1(Red)、通道2(Green)、通道3(Blue),分别使用Kernel1、Kernel2、Kernel3。每个卷积核在对应的单色图像上滑动,对每个位置上的小块区域(Kernel大小)内的像素值与卷积核的相应元素进行逐点乘法运算,然后将这些乘积相加得到一个值。再将每个通道得到的数值相加,并加上总体的偏置Bias,即可得到对应特征图(feature map)中的一个值。

立体效果如下图所示:

零基础也能搞懂卷积神经网络原理!超详细!

2.Padding

如上所述边缘检测的例子中,可以看到,原图片尺寸是10x10,经过filter之后是8x8。如果再做一次卷积运算就是6x6...这样的话会有两个缺点:

  • 每次做卷积操作,输出图片尺寸缩小
  • 角落或边缘区域的像素点在输出中采用较少,因此容易丢掉图像边缘位置的许多信息。

如下图中左上角红色阴影只被一个输出触碰到,而中间的像素点(紫色方框标记)会有许多3x3的区域与之重叠。所以,角落或边缘区域的像素点在输出中采用较少,容易丢掉图像边缘位置的许多信息。

零基础也能搞懂卷积神经网络原理!超详细!

为了解决这一问题,我们通常采用Padding的方法,在卷积操作之前,先给原图片边缘填充一层像素, 例如,将10x10的图像即可填充为12x12的大小,卷积之后的图片尺寸为8x8,和原始图片一样大,这样便使得原图的边缘区域像素点也可以多次被采用。

选择填充多少像素,通常有两种选择:

  • Same卷积:即如上所述,填充再卷积之后的图片大小与原图片一致。
  • Valid卷积:不进行填充操作,直接卷积。

3.stride

stride的概念在引言中有提到过,表示过滤器filter在原图片中水平方向和竖直方向每次滑动的长度,也叫步进长度。

假设s表示stride长度,p表示padding长度,原图片尺寸是nxn,过滤器filter尺寸是fxf,则卷积后的图片尺寸为:

零基础也能搞懂卷积神经网络原理!超详细!

4.池化

池化的本质就是降维。

卷积网络中池化层的作用:降低特征图的参数量、提升计算速度、增加感受野,也即为一种降采样操作。

物体检测中常用的池化:最大值池化(Max Pooling)与平均值池化(Average Pooling)。

(1) Max pooling

即在滤波器filter滑动区域内取最大值,而无需卷积运算。数字大意味着可能探测到了某些特定的特征,忽略了其它值,降低了噪声影响,提高了模型健壮性。「并且,Max pooling需要的超参数仅为滤波器尺寸f和stride长度s,无需要训练其它参数,计算量较小。」

零基础也能搞懂卷积神经网络原理!超详细!

(2) Average pooling

即在滤波器filter滑动区域内求平均值。

零基础也能搞懂卷积神经网络原理!超详细!

5.Shape

在处理多维数据,尤其是图像数据时,Tensorflow和Pytorch数据Shape有所区分。

  • TensorFlow:(batch_size, height, width, in_channels)
  • Pytorch:(batch_size, in_channels, height, width)

其中:

  • batch_size:批量处理的样本数量。
  • in_channels:输入图像的通道数,对于彩色图像通常是3(红、绿、蓝)。
  • height和width分别是图像的高度和宽度。

零基础也能搞懂卷积神经网络原理!超详细!

如上图所示:

  • 输入图片Shape:[height, width, channels],即[8,8,3],表示一个8x8的图像,有3个通道(R、G、B)。
  • 卷积核Shape:[kernel_height, kernel_width, in_channels, out_channels],即[3,3,3,5],表示一个3x3的卷积核,有3个通道(R、G、B),输出通道数是5。
  • 输出图片Shape:[height, width, out_channels],即[6,6,5],表示一个6x6的输出图片,有5个通道(R、G、B)。
out_height = (height - kernel_height + 1) / strideout_width = (width - kernel_width + 1) / stride
登录后复制

对于8x8的图像和3x3的卷积核,输出尺寸将是 (8 - 3 + 1) / 1 = 6,因此输出形状是 [6, 6, 5],表示一个6x6的特征图,有5个输出通道。

卷积核的输入通道数(in_channels)由输入图像的通道数决定,比如:一个RGB格式的图片,其输入通道数为3。

而输出矩阵的通道数(out_channels)是由卷积核的输出通道数所决定,即卷积核有多少个不同的滤波器(filter)。在这个例子中,卷积核有5个滤波器,所以输出有5个通道。

6.激活函数

并不是所有的映射关系都可以用线性关系准确表达。因此需要激活函数表示非线性映射。

激活函数也就是非线性映射。神经网络如果仅仅是由线性运算堆叠,是无法形成复杂的表达空间的,也就很难提取高语义信息,因此需要加入非线性映射关系。

(1) Sigmoid函数

零基础也能搞懂卷积神经网络原理!超详细!

零基础也能搞懂卷积神经网络原理!超详细!

Sigmoid函数将特征压缩到了(0,1)区间,0端是抑制状态,1端是激活状态,中间部分梯度最大。

(2) Relu函数

修正线性单元(Rectified Linear Unit, ReLU)。通常用于缓解梯度消失现象。

零基础也能搞懂卷积神经网络原理!超详细!

在小于0的部分,值与梯度为0,大于0导数为1,避免了Sigmoid函数中梯度接近于0导致的梯度消失问题。

零基础也能搞懂卷积神经网络原理!超详细!

(3) Softmax函数

多物体类别较为常用的分类器是Softmax函数。

在具体的分类任务中,Softmax函数的输入往往是多个类别的得分,输出则是每一个类别对应的概率,所有类别的概率取值都在0~1之间,且和为1。

Softmax函数公式如下:

零基础也能搞懂卷积神经网络原理!超详细!

其中,Vi表示第i个类别的得分,C代表分类的类别总数,输出Si为第i个类别的概率。

CNN整体结构

卷积神经网络CNN由输入层、卷积层、Relu、池化层和全连接层、输出层组成。

如下图所示是一个卷积网络示例,卷积层是卷积网络的第一层,其后跟着其它卷积层或池化层,最后一层是全连接层。越往后的层识别图像越大的部分,较早的层通常专注于简单的特征(例如颜色和边缘等)。随着图像数据在CNN中各层中前进,它开始识别物体的较大元素或形状,直到最终识别出预期的物体。

零基础也能搞懂卷积神经网络原理!超详细!

其中:

  • 输入层:接收原始图像数据,作为网络的输入。
  • 卷积层:由滤波器filters和激活函数构成,属于CNN的核心层,主要作用是提取样本特征。它由输入数据、filter(或卷积核)和特征图组成。若输入数据是RGB图像,则意味着输入将具有三个维度——高度、宽度和深度。filter的本质是一个二维权重矩阵,它将在图像的感受野中移动,检查特征是否存在。卷积的运算过程如上所述。卷积层一般要设置的超参数包括过滤器filters的数量、步长stride以及Padding的方式(valid or same)以及激活函数等。
  • 池化层:本质即就是下采样(Downsampling),利用图像局部相关性原理,对图像进行子抽样,在保留有用信息的前提下减小数据处理量,具有一定的防止模型过拟合作用。
  • 全连接层:该层的每一个结点与上一层的所有结点相连,用于将前边提取到的特征综合在一起。通常,全连接层的参数是最多的。
  • 输出层:根据全连接层的信息得到概率最大的结果。

CNN的优势

与传统神经网络相比CNN具有局部连接、权值共享等优点,使其学习的参数量大幅降低,且网络的收敛速度也更快。

  • 局部連接:特徵圖的每個輸出值不需要連接到輸入影像中的每個像素值,而只需要連接到應用濾鏡filter的感受野,因此卷積層通常被稱為“部分連接層”,這種特性也即是局部連接。
  • 權值共用:當卷積核在影像上移動時,其權值是不變的。即為權值共享。

以上是零基础也能搞懂卷积神经网络原理!超详细!的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
如何理解C  中的DMA操作? 如何理解C 中的DMA操作? Apr 28, 2025 pm 10:09 PM

DMA在C 中是指DirectMemoryAccess,直接内存访问技术,允许硬件设备直接与内存进行数据传输,不需要CPU干预。1)DMA操作高度依赖于硬件设备和驱动程序,实现方式因系统而异。2)直接访问内存可能带来安全风险,需确保代码的正确性和安全性。3)DMA可提高性能,但使用不当可能导致系统性能下降。通过实践和学习,可以掌握DMA的使用技巧,在高速数据传输和实时信号处理等场景中发挥其最大效能。

C  中的chrono库如何使用? C 中的chrono库如何使用? Apr 28, 2025 pm 10:18 PM

使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron

怎样在C  中处理高DPI显示? 怎样在C 中处理高DPI显示? Apr 28, 2025 pm 09:57 PM

在C 中处理高DPI显示可以通过以下步骤实现:1)理解DPI和缩放,使用操作系统API获取DPI信息并调整图形输出;2)处理跨平台兼容性,使用如SDL或Qt的跨平台图形库;3)进行性能优化,通过缓存、硬件加速和动态调整细节级别来提升性能;4)解决常见问题,如模糊文本和界面元素过小,通过正确应用DPI缩放来解决。

C  中的实时操作系统编程是什么? C 中的实时操作系统编程是什么? Apr 28, 2025 pm 10:15 PM

C 在实时操作系统(RTOS)编程中表现出色,提供了高效的执行效率和精确的时间管理。1)C 通过直接操作硬件资源和高效的内存管理满足RTOS的需求。2)利用面向对象特性,C 可以设计灵活的任务调度系统。3)C 支持高效的中断处理,但需避免动态内存分配和异常处理以保证实时性。4)模板编程和内联函数有助于性能优化。5)实际应用中,C 可用于实现高效的日志系统。

量化交易所排行榜2025 数字货币量化交易APP前十名推荐 量化交易所排行榜2025 数字货币量化交易APP前十名推荐 Apr 30, 2025 pm 07:24 PM

交易所内置量化工具包括:1. Binance(币安):提供Binance Futures量化模块,低手续费,支持AI辅助交易。2. OKX(欧易):支持多账户管理和智能订单路由,提供机构级风控。独立量化策略平台有:3. 3Commas:拖拽式策略生成器,适用于多平台对冲套利。4. Quadency:专业级算法策略库,支持自定义风险阈值。5. Pionex:内置16 预设策略,低交易手续费。垂直领域工具包括:6. Cryptohopper:云端量化平台,支持150 技术指标。7. Bitsgap:

怎样在C  中测量线程性能? 怎样在C 中测量线程性能? Apr 28, 2025 pm 10:21 PM

在C 中测量线程性能可以使用标准库中的计时工具、性能分析工具和自定义计时器。1.使用库测量执行时间。2.使用gprof进行性能分析,步骤包括编译时添加-pg选项、运行程序生成gmon.out文件、生成性能报告。3.使用Valgrind的Callgrind模块进行更详细的分析,步骤包括运行程序生成callgrind.out文件、使用kcachegrind查看结果。4.自定义计时器可灵活测量特定代码段的执行时间。这些方法帮助全面了解线程性能,并优化代码。

C  中的字符串流如何使用? C 中的字符串流如何使用? Apr 28, 2025 pm 09:12 PM

C 中使用字符串流的主要步骤和注意事项如下:1.创建输出字符串流并转换数据,如将整数转换为字符串。2.应用于复杂数据结构的序列化,如将vector转换为字符串。3.注意性能问题,避免在处理大量数据时频繁使用字符串流,可考虑使用std::string的append方法。4.注意内存管理,避免频繁创建和销毁字符串流对象,可以重用或使用std::stringstream。

MySQL批量插入数据的高效方法 MySQL批量插入数据的高效方法 Apr 29, 2025 pm 04:18 PM

MySQL批量插入数据的高效方法包括:1.使用INSERTINTO...VALUES语法,2.利用LOADDATAINFILE命令,3.使用事务处理,4.调整批量大小,5.禁用索引,6.使用INSERTIGNORE或INSERT...ONDUPLICATEKEYUPDATE,这些方法能显着提升数据库操作效率。

See all articles