热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【学习笔记】深度学习之CNN卷积神经网络

什么是CNNCNNCNN(卷积神经网络)?定义卷积神经网络(ConvolutionalNeuralNetworkConvolutionalNeuralNetworkConvolut

什么是CNNCNN(卷积神经网络)?

定义

卷积神经网络(ConvolutionalNeuralNetworkConvolutional Neural Network, CNNCNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。

卷积神经网络由一个或多个卷积层和顶端的全连通层(对应经典的神经网络)组成,同时也包括关联权重池化层PoolingLayerPooling Layer)。这一结构使得卷积神经网络能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网络在图像语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。

作为深度学习中比较重要也广为人知的一种网络结构——卷积神经网络——是非常令人吃惊的。它变成了一种颠覆性的技术,打破了从文本、视频到语音等多个领域所有最先进的算法,远远超出了其最初在图像处理的应用范围。

神经网络,顾名思义,是科学家们类比生物神经网络搭建的一种人工网络,模仿生物进行图像、音频等信息进行处理从而快速得到我们想要的信息。

卷积,则是指在人工神经网络处理信息的过程中使用了卷积这种数学上的运算方法。卷积网络是一种特殊的神经网络,它们在至少一个层中使用卷积代替一般矩阵乘法。

CNNCNN的结构

卷积神经网络由一个输入层和一个输出层以及多个隐藏层组成。CNNCNN的隐藏层通常由一系列与乘法或其他点积卷积的卷积层组成。

**函数通常是ReLUReLU层,随后是其他卷积。

例如池化层,全连接层和归一化层(SoftmaxSoftmaxSigmoidSigmoid),称为隐藏层,因为它们的输入和输出被**函数和最终卷积掩盖了。
【学习笔记】深度学习之CNN卷积神经网络
卷积神经网络的结构:输入层(InputLayerInput Layer)—卷积层(ConvolutionalLayerConvolutional Layer)—池化层(PoolingLayerPooling Layer)—卷积层—池化层(降采样层)—…—全连接层—全连接层—…—输出层(全连接层+SoftmaxSoftmax**)

其中,卷积和池化次数依据需求来定,全连接层同理。

卷积-池化-全连接只是最基础的CNNCNN

随着人工智能的不断发展,现在已经由许多种由此衍生出来的CNNCNN(卷积方式、信息传递的flowflow等有所不同),但是其根本结构还是大同小异的。

【学习笔记】深度学习之CNN卷积神经网络

卷积层

作用:提取图像的底层特征

卷积层是一组平行的特征图(feature map),它通过在输入图像上滑动不同的卷积核并执行一定的运算而组成。此外,在每一个滑动的位置上,卷积核与输入图像之间会执行一个元素对应乘积并求和的运算以将感受野内的信息投影到特征图中的一个元素。这一滑动的过程可称为步幅 stridestride,步幅stridestride 是控制输出特征图尺寸的一个因素,是我们需要设置的一个超参数。卷积核的尺寸要比输入图像小得多,且重叠或平行地作用于输入图像中,一张特征图中的所有元素都是通过一个卷积核计算得出的,也即一张特征图共享了相同的权重和偏置项。

【学习笔记】深度学习之CNN卷积神经网络
该动图演示的是在输入图像上滑动一个3×33\times3的卷积核,且其步长设为1,感受野为7×77\times7

卷积核是一种特征发现器,我们通过卷积层可以很容易地发现图像中的各种边缘

但是卷积层发现的特征往往过于精确,我们即使高速连拍拍摄一个物体,照片中的物体的边缘像素位置也不大可能完全一致,因此,我们需要通过池化层来降低卷积层对边缘的敏感性。

卷积后的图像尺寸

我们假定输入图片尺寸为 m x n,输出的图片尺寸为 l x c,跨度用 stride 表示,卷积核大小用 k 表示,则有下面公式。

l=(mk)/stride+1c=(nk)/stride+1\begin{array}{l} l=(m-k) / \text {stride}+1 \\ \\c=(n-k) / \text {stride}+1 \end{array}

池化层

作用:缩小数据维度(防止数据爆炸,节省运算量和运算时间),防止过拟合(防止过学习,即防止培养出高分低能,在考场(训练集)称霸但在社会上(测试集)混不下去的人工智障)

池化,也叫做下采样(subsampling),用一个像素代替原图上邻近的若干像素,在保留feature map特征的同时压缩其大小。

池化实际上是一种非线性形式的降采样。有多种不同形式的非线性池化函数,主要有两种:Maximum Pooling和Average Pooling

而其中“最大池化(Max Pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。

【学习笔记】深度学习之CNN卷积神经网络
可以看出,如果向下面动图演示的一样进行池化,那么会大大减少参数的数量,在尽可能保留原始特征的同时提高系统的运行速度。

【学习笔记】深度学习之CNN卷积神经网络

全连接层

全连接层:输出的每个神经元都和上一层每一个神经元连接。
【学习笔记】深度学习之CNN卷积神经网络

汇总经过前面处理得到的信息,并进行输出

最后,在经过几个卷积和池化层之后,神经网络中的高级推理通过全连接层来完成。就和常规的非卷积人工神经网络中一样,全连接层中的神经元与前一层中的所有**都有联系。
输出可以是Softmax输出,也可以是Sigmoid二分类输出

【学习笔记】深度学习之CNN卷积神经网络
上图中箭头所指即为全连接层。可以看到,神经网络对处于最底部的输入层(手写数字33)进行卷积、池化、全连接等操作,最后进行归一化,在090-9十个数字中,选出概率最大的数,即为目标数字33
【学习笔记】深度学习之CNN卷积神经网络
该图是CNN的输出层。

名词解释

卷积核

卷积核并没有什么神秘的,它是一个 22 维数组。它的行数和列数相同并且数值为奇数
【学习笔记】深度学习之CNN卷积神经网络
上面就是一个 3x33x3 的卷积核,它的核大小(kernel size) 为 33。它里面的元素值代表不同的权值。

一般而言,卷积核里面所有元素之和等于 11,当然也可以不让它等于 11,大于11时生成的图片亮度会增加,小于 00 时生成的图片亮度会降低。

那么,卷积核是如何作用呢?

一句话描述就是:针对输入层中单个元素,将它的值由周围邻近的元素值加权平均。而这种加权平均的操作产生的新的元素值按照次序可以产生一个新的输出层。

【学习笔记】深度学习之CNN卷积神经网络

需要注意的是,在深度学习当中,只需要逐元素相乘再相加就可以了,不需要对结果取均值。

感受野

在机器视觉领域的深度神经网络中有一个概念叫做感受野,用来表示网络内部不同位置的神经元对原图像的感受范围的大小。

神经元之所以无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和池化层,层与层之间均为局部相连(通过slidingfiltersliding filter)。

神经元感受野的值越大,表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;值越小则表示其所包含的特征越趋向于局部和细节。

因此感受野的值可以大致用来判断每一层的抽象层次。

【学习笔记】深度学习之CNN卷积神经网络
可以看到在Conv1Conv1中的每一个单元所能看到的原始图像范围是3×33 \times 3,而由于Conv2Conv2的每个单元都是由2×22 \times 2范围的Conv1构成,因此回溯到原始图像,其实是能够看到 5×55 \times 5的原始图像范围的。

因此我们说Conv1Conv1的感受野是33Conv2Conv2的感受野是55. 输入图像的每个单元的感受野被定义为11,这应该很好理解,因为每个像素只能看到自己。

步长

滑动卷积核时,我们会先从输入的左上角开始,每次往左滑动一列或者往下滑动一行逐一计算输出,我们将每次滑动的行数和列数称为Stride,下面两张动图中,步长分别为Stride=1;Stride=2。

【学习笔记】深度学习之CNN卷积神经网络
卷积过程中,有时需要通过padding来避免信息损失,有时也要在卷积时通过设置的步长(Stride)来压缩一部分信息,或者使输出的尺寸小于输入的尺寸。

【学习笔记】深度学习之CNN卷积神经网络
stride的作用:是成倍缩小尺寸,而这个参数的值就是缩小的具体倍数,比如步幅为2,输出就是输入的1/2;步幅为3,输出就是输入的1/3。以此类推。

【卷积核的大小一般为奇数】 1×11\times13×33\times35×55\times57×77\times7都是最常见的。这是为什么呢?为什么没有偶数?

(1)更容易padding

在卷积时,我们有时候需要卷积前后的尺寸不变。这时候我们就需要用到padding。假设图像的大小,也就是被卷积对象的大小为n×nn \times n,卷积核大小为k×kk \times k,padding的幅度设为 (k1)2\frac{(k-1)}{2} 时,卷积后的输出就为nk+2×k121+1=n\frac{n-k+2\times\frac{k-1}{2}}{1}+1=n
即卷积输出为n×nn \times n,保证了卷积前后尺寸不变。但是如果kk是偶数的话, (k1)2\frac{(k-1)}{2}就不是整数了。

(2)更容易找到卷积锚点

在CNN中,进行卷积操作时一般会以卷积核模块的一个位置为基准进行滑动,这个基准通常就是卷积核模块的中心。若卷积核为奇数,卷积锚点很好找,自然就是卷积模块中心,但如果卷积核是偶数,这时候就没有办法确定了,让谁是锚点似乎都不怎么好。

【卷积的计算公式】

输入图片的尺寸:一般用n×nn \times n表示输入的image大小。

卷积核的大小:一般用 f×ff \times f表示卷积核的大小。

填充(Padding):一般用 pp 来表示填充大小。

步长(Stride):一般用 ss 来表示步长大小。

输出图片的尺寸:一般用 oo 来表示。

如果已知 nnffppss 可以求得 oo ,计算公式如下:o=n+2pfs+1o=\left\lfloor\frac{n+2 p-f}{s}\right\rfloor+1

其中" \lfloor \rfloor"是向下取整符号,用于结果不是整数时进行向下取整。

PaddingPadding

Padding,意为填充。可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。

这是因为边缘上的像素永远不会位于卷积核中心,而卷积核也没法扩展到边缘区域以外。

这个结果我们是不能接受的,有时我们还希望输入和输出的大小应该保持一致。

为解决这个问题,可以在进行卷积操作前,对原矩阵进行边界填充(Padding),也就是在矩阵的边界上填充一些值,以增加矩阵的大小,通常都用“00”来进行填充的。【学习笔记】深度学习之CNN卷积神经网络

通过填充的方法,当卷积核扫描输入数据时,它能延伸到边缘以外的伪像素,从而使输出和输入size相同。

常用的两种padding:

(1)valid padding:不进行任何处理,只使用原始图像,不允许卷积核超出原始图像边界

(2)same padding:进行填充,允许卷积核超出原始图像边界,并使得卷积后结果的大小与原来的一致

权值共享

权值共享:卷积核扫过整张图片的过程中,卷积核参数不变。

下图的动画中,绿色表示原图像素值,红色数字表示卷积核中的参数,黄色表示卷积核在原图上滑动。右图表示卷积运算之后生成的feature map。
【学习笔记】深度学习之CNN卷积神经网络
下图展示了RGBRGB三个通道图片的卷积运算过程,共有两组卷积核,每组卷积核都有三个filter分别与原图的RGBRGB三个通道进行卷积。每组卷积核各自生成一个feature map。
【学习笔记】深度学习之CNN卷积神经网络

原图最外圈补0:zero padding,便于提取图像边缘的特征。

局部连接

feature map上每个值仅对应着原图的一小块区域,原图上的这块局部区域称作感受野(receptive field)。局部连接的思想,受启发于生物学里面的视觉系统,视觉皮层的神经元就是局部接受信息的。
【学习笔记】深度学习之CNN卷积神经网络
【学习笔记】深度学习之CNN卷积神经网络

多通道卷积

上述例子都只包含一个输入通道。实际上,大多数输入图像都有 RGB 3个通道。

【学习笔记】深度学习之CNN卷积神经网络
这里就要涉及到“卷积核”和“filter”这两个术语的区别。在只有一个通道的情况下,“卷积核”就相当于“filter”,这两个概念是可以互换的。但在一般情况下,它们是两个完全不同的概念。每个“filter”实际上恰好是“卷积核”的一个集合,在当前层,每个通道都对应一个卷积核,且这个卷积核是独一无二的。

多通道卷积的计算过程:将矩阵与滤波器对应的每一个通道进行卷积运算,最后相加,形成一个单通道输出,加上偏置项后,我们得到了一个最终的单通道输出。如果存在多个filter,这时我们可以把这些最终的单通道输出组合成一个总输出。

这里我们还需要注意一些问题——滤波器的通道数、输出特征图的通道数。

某一层滤波器的通道数 = 上一层特征图的通道数。如上图所示,我们输入一张 6×6×36\times6\times3的RGB图片,那么滤波器(3×3×33\times3\times3)也要有三个通道。

某一层输出特征图的通道数 = 当前层滤波器的个数。如上图所示,当只有一个filter时,输出特征图(4×44\times4)的通道数为1;当有2个filter时,输出特征图(4×4×24\times4\times2)的通道数为2。

Conferences

1.How Convolutional Neural Networks work
2.大白话讲解卷积神经网络工作原理
3.卷积神经网络(CNN,ConvNet)及其原理详解
4.【子豪兄】深度学习之卷积神经网络
5.【深度学习入门】——亲手实现图像卷积操作
6.手写数字识别3D可视化网站
7.深度神经网络中的感受野(Receptive Field)
8.CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)
9.TensorFlow中CNN的两种padding方式“SAME”和“VALID”


推荐阅读
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 目前我有两张 BMP 图像文件 a.bmp 和 b.bmp,希望将它们按照以下方式进行融合:首先提取 a.bmp 的所有奇数行像素(如第 1、3、5 行),接着获取 b.bmp 的所有偶数行像素(如第 2、4、6 行)。最终目标是将这些行像素交替排列,生成一张新的图像。此过程需要确保像素顺序正确,并保持图像的整体结构和质量。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文详细介绍了定时器输入捕捉技术的原理及其应用。通过配置定时器通道的引脚模式为输入模式,并设置相应的捕获触发条件,可以实现对外部信号的精确捕捉。该技术在实时控制系统中具有广泛的应用,如电机控制、频率测量等场景。文中还提供了具体的配置步骤和示例代码,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 浅析卷积码的应用及其优势:探讨卷积编码在通信系统中的关键作用与特性
    本文详细介绍了卷积编码的基本原理,并深入分析了其在通信系统中的应用及其显著优势。卷积编码通过在编码过程中引入冗余信息,有效提高了数据传输的可靠性和抗干扰能力,成为现代通信系统中不可或缺的关键技术。文章还探讨了卷积编码在不同场景下的具体实现方法及其性能特点。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
author-avatar
上床后悔_155
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有