| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 白话机器学习-卷积神经网络CNN -> 正文阅读 |
|
[人工智能]白话机器学习-卷积神经网络CNN |
一 背景在卷积神经网络CNN 出现之前,图像对于人工智能来说就是一个灾难,主要是有两个原因:
1 参数共享机制假设我们使用全连接层进行图像特征的提取,即使使用最简单的数据集例如MNIST数据。每个图片的尺寸是28x28x1,其中28x28是图片的大小,1是表示图像是黑白的,即只有一个色彩通道。假设第一层的隐藏层的节点数量是600,那么这个全连接神经网络将有28x28x600+600=471000个参数。这还仅仅是最简单的数据集,如果是其他的复杂的数据集参数量会更加迅速的膨胀。过多的参数有两方面的坏处,一是计算会严重减慢;另外一个就是非常容易过拟合。所以需要一个更加合理的神经网路结构来有效的减少参数数量,同时保持原始数据的特征,进行抽象。 2 平移不变原理图片数字化的传统方式我们简化一下,就类似下图的过程: 假如图像中有一个圆形,那么基于圆形的位置的不同就会产生完全不同的数据表征。但是从视觉的角度来看,「图像的内容(本质)并没有发生变化,只是位置发生了变化」,这就产生了一个矛盾。 所以当我们移动图像中的物体,用传统的方式得出来的数据表征会差异很大!无法满足也不符合图像处理的要求的。 「而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。」 3 模型结构灵感深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。 1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“「发现了视觉系统的信息处理」”,可视皮层是分级的。 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例: 对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的: 我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。 那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢? 「答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。」 二 卷积神经网络CNN? 1 CNN网络结构特点对于神经网络,针对神经元不同的连接方式,有几种经典的网络类型:「全连接神经网络、卷积神经网络与循环神经网络」等等。
虽然上图显示的全连接神经网络和卷积神经网络的模型结构在直观上来看差异比较大,但是实际上它们的整体结构是非常相似的。
2 模型整体结构下面我们给出一个更加具体的模型结构(以分类问题为例)。 ?
三 卷积层?
内核矩阵的尺寸是三维的,但是我们仅仅需要指定长和宽就好,因为内核的矩阵的深度和当前神经网络层的矩阵的深度是一致的。另外需要特别指定的是输出单位节点矩阵的深度,通常我们将这个深度称之为内核矩阵的深度。常用的内核大小是3x3或者5x5。
基于卷积神经网络参数共享的性质,下面我们来分析下卷积层的参数的数量,假设输入层的节点数量是32x32x3,内核的尺寸是2x2,转换后的单位节点矩阵的尺寸是1x1x5。那么根据卷积神经网络参数共享的性质,可以得到卷积层的参数的个数是2x2x3x5+5=65个参数。对比下使用全连接的神经网络的情况,假设卷积层后三维矩阵的长度与宽度不变(全0填充,后续介绍),深度变为5,那么整体参数是 32x32x3x32x32x5 + 32x32x5 = 15733760(一千五百万多参数)。由此可见,使用卷积层之后,参数量会大大减少,并且基于平移不变原理,基本保留了图像的深度特征进行抽象。
假设输入层的深度为3,内核的尺寸是2x2,生成的单位节点矩阵是1x1x1,那么计算的过程如上图所示(f函数是Relu函数)。 PS:如果生成的单位节点矩阵的深度不是1,是N的话,那么就再有N组参数进行计算。比如N的2的话。增加参数
针对输入的神经网络层的神经元,先不考虑深度因素,我们考虑二维的结构。首先内核作用于左上角矩阵,然后移动到左下角矩阵,再到右上角矩阵,最后到右下角矩阵。内核每移动一次,可以计算出一个值(深度为N的时候会计算出N个值,详见上面的描述)。并且将这些数值拼接成一个新的矩阵,这样就完成了卷积层前向传播的过程。如下如所示:
「当内核的尺寸不是1x1的时候,卷积层经过前向传播得到的矩阵的尺寸会小于当前层军阵的尺寸」,如上图所示。如果要保持矩阵尺寸不变化的话,可以在当前矩阵的边界上进行全0的填充(zero-padding)。这样可以使得卷积层经过前向传播后得到的矩阵的尺寸和当前层的矩阵保持一致,如下图是使用全0填充的效果。 「除了内核的尺寸会影响卷积层经过前向传播得到矩阵的尺寸外,stride步长也会影响」,针对上图使用全0填充,并且步长为2(长度宽度均是2)的情况下,卷积层操作如下
针对是否使用全0填充,分别计算公式如下:
四 池化层? 1 池化层的正向传播「同卷积层类似,池化层的内核也是需要设定尺寸、是否全0填充以及步长等,而且这些设置的意义也是一样的。同时卷积层和池化层的内核的移动方式也相似的」。池化层的一般作用是对特征图进行下采样,它本身没有参数权重,计算也简单,但它可达到降维特征、突显特征、减少参数量、减少计算量、增加非线性、防止过拟合及提升模型泛化能力等作用,池化层的前向传播我们都比较好理解区别有两点:
下面是Max Pooling的一个示例,大家可以理解下,由于大部分流程与卷积层类似,所以这块不过多描述。 2 池化层的反向传播? 池化层在反向传播时,由于没有参数参数计算正向传播过程,所以它是不可导的,并且池化层会缩小矩阵的尺寸,比如一个2x2的池化,经过池化层输出的特征图是16个神经元,那么对应当前层就会有64个神经元,两层之间经过池化操作后,特征图尺寸改变,无法一一对应,这使得梯度无法传播。 在反向传播时,「梯度是按照链式法则进行传播的,但是池化层没有参数,那那么要解决的问题就是如何这个虚拟的链路与计算规则,并且要遵守传播梯度总和保持不变的原则」。 以最大池化为例,前向传播过程是取一定特征区域的最大值进行输出,所以本区域只有最大值的神经元参与了前向传播过程。因此在反向传播过程中只需将该区域的梯度直接分配到最大值的神经元就好,其他神经元的梯度被分配为0并且不参与反向传播过程。 但是如何确认最大值神经元呢?这个需要深度学习框架在进行前向传播时记录下最大值神经元的Max ID位置,反向传播的时候将梯度回传给这个神经元就好。 五 番外篇? 六 公众号导读自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,社区做过多次分享,另外自己坚持写原创博客,多篇文章有过万的阅读。公众号「秃顶的码农」大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。 一切有为法,如梦幻泡影,如露亦如电,应作如是观。 本文由 mdnice 多平台发布 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:52:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |