大话卷积神经网络CNN,小白也能看懂的深度学习算法教程,全程干货建议收藏
来源 | 程序员管小亮
本文创作的主要目的,是对时下最火最流行的深度学习算法的基础知识做一个简介,作者看过许多教程,感觉对小白不是特别友好,尤其是在踩过好多坑之后,于$ L Y 8 j 9是便有了写这0 / . X y d 9篇文章的想法。
由于文章较长,建议收藏~
本文文中会有个人推荐的学习g # 5 M G H S资源。
一、简介
百度百科中对深度学习的定义是深度学习(DL, Deep LearningP / `)是机器学习(ML, Machine Learnit ^ X Q U 6 D r Ang)领域中一个新的研究方向,它被引入机器学习使s Z C Z P : i A p其更接近于最初的目标——人工智能(AI, Artificial Intelligence)。这个定义太大了,反而让人_ ( | ? W | ? O有点不懂,简答来说,深度学习就是通过多层神经网络上运用各种机器学习算法学习样本数据的内在规律和表示层次,从而实现各种任务的算法集合。各种任务都是啥,有:数据挖掘,计算机视觉,~ i B ;语音识别,自然语言处6 M @ n m P P f L理等。
可能有人会问那么深度学习,机器学习还有人工智能的关系是怎么样的呢?在这个博客中有详细介绍:一篇文章看懂人工智能、机器学习和深度学习,我们这里直接拿出结论:
AI:让机器展现出人类智力
机器学习:抵达AI目标的一条路K & ~ N c ^ Z径
深度学习:实现机器学习的技术
深度学习从大类上可以归入神经网络,不过在具体实现上有许多} $ @ / 8 H n变化,并不像大家听到的一样,觉得这两个概念其实是@ - $ E同一个东西:
从广义上说深度学习的网络结构也是多层神经网络的一种。更简单来说,多层神经网络做的步骤是:特征映射到7 7 . 3 U $ = ] k值。特征] ~ F X F U是人工挑选。深度学习O p f ; K做的步骤是 信号->特征->值。特征是由网络自己选择。
深度学习的核心是 特征学习,旨在通过分层网络获取分层次的特征信X d | 8 Q E息C d M,从而解决以往需要人工设计特征的重要难题。深度学习是一个{ U ( ?框架,包含多个重要算法:
Convolutional Neural Networks(CNN)卷积神经网络
AutoEncoder自动编码器
Sp} b O c Y v 6arse Coding稀疏编码
Restricted Boltzmann Machine(RBM)限制波尔兹曼机
Deep Belo p R i Rief Networks(DBN)深度信念网络
Rec} r K o , *uY m ( } + f -rrent neurn ` M r P V qal Network(RNN)多层反馈循环神经网络神经网络
对不同的任务(图像,语音,文本),需要选用不同的网络模型才能达到更好的效果。
此外,最近几年 增强学习(Reinforcement Learning)与深度学习的结合也创造c , H A 3了许多了不起的成果,AlphaGo就是其中之一。
大家比较关注的热点新闻,如下图所示:
二、人类O M H ( w W 1 O视觉原理
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献S k p,是“发现了视觉系统的信息处理”——可视皮层是分级的。如下图所示:
进而通过大量试验研究,发现了人类的视觉原理,具体如下:从原始信号 摄入[ u } P ` J开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前z _ { } { h g P的物/ y u @ Q体的形状,是圆形的),然后进一步抽象n m f(大脑进一步判定该物体是只气球)。
下面是人脑进行人脸识别的一个示例。如下图所示:
总的来说,人的视* ) E I a :觉系统的信3 & A n息处理是 分级的。从低级的V1区提取边缘特征,再到V2区的形状或者目标的部分等,再到更高层,整个目标、目标的行为等。也就是说n # p r e高层的特征是低层特e q % N征的组合,从低层到高层的特征表示越来越抽象,越来越能表现语义或者意图。而抽象层面越高,存在的可能猜测就越少,就越利于分类。
对于不同的物体,人类视觉也是通过这样 逐层分级,来进; o ( + w (行认知的。如下图所示:
那么可以很自然n S R V j G ^的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图e x g像特征,若干底层特征组成更上一层特征,最终通过_ o T B多个层级的组B j N a H n 9 U合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。
三、神经网络
首先什么是神经网络呢?神经网络也指的是 人工神经网络(Artificial Neural Networks,简称ANNs),是一种模仿生物神经网络行为特征的算法数学模型,由神经元、节点与节点之间的连接(突触)所构成,如下图所示:
每个神经网络单元抽象出来的数学模型如下,也叫 感知器,它接收多个输入(
单个的感知器就构成了一个简, T V :单的模型,但在现实世界中,实际的决策模型则要复杂得多,往往是由多个感知器组成的多层网络,如下图所示,这也是经典的神经网络模型d F h X x d - C * x着广泛的y C G S c @ R应用。
四、卷积神经网络
4.n G ]1、CNN定义
主角登场,其他人退让!!!如下图所示:
重点来了,什么是卷积神经网络?
百度百科中的定义是 卷积神经网络(Convolutional NeurB 0 Y 2 x | -al Networks,[ c 7 _ = A CNN)是一类包含卷积计算且具有深度结构的前馈t p [ _ 5 Q S 3神经网络(F- l f Teedforward Neural Net; [ b t v W R zworks),是深度学; P ; D . s u L习(deep learning)3 ; u ( U c Y P ^的m G ! e代表算法之一,6 K P T $擅长处理图像特别是图像识别等相关机器学习问题。
卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能! 4 C W E - k够被训练。
4.2、卷积(Convolution)
卷积神经网络中的核心即为卷积运算,其相当于图像处理中的滤波器运算。对于一个 大小的卷积核,其对某f & C P一原图像 进行卷7 [ K :积运算的过程为:卷积核 中的每一个权值 分别和覆盖的原图像 中所对应的像素 相乘,然后再求和。计算公式为:
所以一幅图像的一个完整的卷积运算过程为:卷积核以一定的间隔滑动,并对所覆盖的区域进行卷积运算得到值 z,直至遍历完整幅图像。如下图所示:!(https://img-blog.csdnimg.cn/2019082A q ~ G 2 v ]5170718271.gif#pic_cenD u s k F B ) q xter =500x400) 举- Z H g Y 1 ! b一个标准的卷积运算例子,初始位置的计算l w y Y . W d v过程是:1x1+1x0+1x1+0x0+1x1+1x0+0x1+0x0+0 6 y F1x1=4,详细的就不推导了。
如上图,卷积核大小是3x3的,也就是说其卷积核每次覆盖原图像的9个像素,行和列都滑动了3次,一共滑动q h , F z3x3=9次,得到了一个 的二维数据。这个大小是怎么计算的呢?
首先给出结论,对于一个大小为 的原图像,经过大小为 的卷积运算后,其输出图像的尺寸为 。所以对于上图的例子,5-3+1=3即为所求。
4.3、步长(stride)
滑动一定的间距,但这个间距该如何] e F定义呢? 这个_ I 3概念就是卷积的 “步长”(strJ ? _ 1 k Bide)。经过步长 的操作后,其输出图像的尺寸为:
其中 n 是图像大小,f 是卷积核大小,s 是步长{ h z / A。
stride = 1 表示卷积核滑过每一个相距是 1 的像素,是最基本的单步滑动,作为标准卷积模式。Stride 是 2 表示卷积核的移动步长是 2,跳过相邻像素,输出图像缩小为原来的 1/2。Stride 是 3 表示卷积核的移动步长是 3,跳过 2 个相邻像素,图像缩小为原来的 1/3,以此类推。。。
详细的卷积层尺寸推算细节可以看一下这个文章——CNN中卷积层的计算细节
4.4、填充(paddinT 7 k O yg)
在标准的卷积过程中,存在两个问题:
每次卷积运算后,图像就会缩小尺寸。在经历多次运算后,图像最终会失去其本来的形状,变为 的 “柱状”。
对于图像边缘的像素,只被一个输出使用,但图像中间的像素,则被多个输出使用。这意味u R C着卷i y d * e /积过程丢掉了图像边缘位置的许多信息。
对于这个问I 5 . W ?题,可以采用额外的 “假” 像素(通常值为 0, 因此经常使用的术语 ”零填充“ )填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素。假设填充的像素大小为 ,则 就变成了 ,故其输出图像的尺寸为 。
至于是否选择填充像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。` . % G { x
- Valid 卷积意味l b I K着 不填充,即图像会通过卷积并逐渐缩小,输出的图像尺寸即为上述公式:。
- Same卷积意味 填充,输出图像的尺寸与] - c Y U * W X `输入图像的尺寸相同。
根据上述尺寸的计算公式,令 ,可得到 。当 s=1 时,c ! w 5。
4.5、池! X f 5 J h ? Q化(Poq 0 @ s H # ooling)
随着模型网络不断加深,卷积核越来越h h } 1 b + t j多,要训练的参数还是很多,而且直接拿卷积核提取的特征直接训练也容易出现过拟X S g G # 0合的现象。CNN使用的另一个有效的工具被称为“池化(Pooling)”出现并解决了上面这些问题,为了有效地减少计算量,池化就是将输入图像进行缩小,减少像素信息c K a 8 9 z ,只保留重要信息;为了: j f | l n h C t有效地解决过拟合问题,池化可以减少数据,但特征的统计属性仍能够描述图像,而由于降低了数据维度,可以有效地避免过拟合。
给出池化的定义,对不同位置区域提取出有代表性的特征(进行聚合统计,例如最大值、平均值等),这种聚合的操作就叫做 池化,池化的过程通常也被称为特征映射的过程(特征降维)。听起来很高深,f Q w 8 R , l k其实简单地说就是下采样。
池化的过程如下图所示:
池化主要有两种,除了 最大值池化(Maxz P h P r C b e Pooling)之外,还有平均值池1 z H U G k化(Average poolL . ? X U ) & King),CNN中随机池化使用的较少。
最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非X } 7 Q `常容易理解,其示意图如下所示:
三种池化的意义:
最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不* f 6 m / | ` a s可得第二层:,令 ,,则第二层变为:。
依此类推,网络的输出仅仅只是输K E H D 6 /入特征的线性组合。实际上,无论网络有多少层,整体完全可以仅使用1层表示。同理,引入其他线性函数 (如 )仍然起不到任何作用,因为线性函数的组合本身仍是线性函数。
常用的激活函数有sigmoid、tanh、relu等等Z ? o ] . i 9 | a,前两% W B y u 8 F { ]者sigmoid / tanh比较常见于全连接层,后者ReLU常见于卷积层。
4.7、局部感知
为什么要采用局部感知呢?因为可以降低参数量级。为什么要降低参数量级呢?因为如果采用经典的神经网络模型,如下图所示:
则需要读取整幅图像作为神经网络模型的输入(即全连接的方式` # O 0 ]),当图像的尺寸越大时,其连接的参数将变得很多,从而导致计算量非常大$ G y。比如对于一张1000x6 ; X ! e1000像素的图片,如果我们有1M隐4 Z 0 Z T藏层单元,那么一1 x 2 k [ T共有 个参数,这显然是不能接受的。如下图所示:
而人类对外界的认知一般是从局部到全局- V ~、从片面到全面,先对局部有感知的认识,再逐步对全体有认知,这是人类的认识模式。V Q # A X f P ~类似的,在机器识别图像时也没有必要把整张图像按像素全部都连接到神经网络中,局部范( K l p * m M围内的像素之间联系较为紧密,而距离较远的像素则相关性较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。这种模K y * )式就是卷积神经网C . a u R , F 3络中降低参数数目的重要神器:局部感受野,节省了内存。
4.8、参数(权f u v Z : F 5 E r值)共享
每张自然图像(人物、山水、建筑等)都有其固有特性,也就是说,图像其中一部分的统计特性与其它部分是接近的。这也意味着这一部分学习的特征也能用在另一部分上。因此i @ c _ y E : X,在局部连接中隐T Y ^ ^ : { I /藏层的每一个神经元连k 0 v - b A 1 . t * e v个例子,假设使用某一特征过滤器(g & N % I检测器)提取 “手写5” 的特征,那么图片的右下角区域,以及旁边的各个区域都可以使用这个过滤器。每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取特征 “5”。而对于全连接网络来说,如果模式出现在新的位置,它+ g E X L只能L L b n 7重新e F O f ] Y # b学习这个模式。这使得卷积神经网络在处理图像时可以高效利用数据(因为视觉世界从根本上具有 平移不变性),只需要更少的训练样本就可以学到具有泛化能力的数据表示。4.9、感受野(Receptive field)
感受野用来表示网络内部的不同神经 0 D o P,} Y j最后的全连接层对物体的类别5 u B y w K d , m(狗或车)有响应。
也就是说,随着层次加深,神经元r + j从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一} ; _样,响应的对象在逐渐变化。
应用
CNN 最早由Yann LeCun提出并应用在手写字体识别上(MINST)。
当年美国大多数银行就是用它来识别支票上 k , ? g N 7面的手写数字的r J * ! J。能够达到这种商用的地步,它的准确性可想而知。毕竟目前学术界和工业界的结合是最受争议的。LeCun提出的网络称为LeNet5(效果和paper等的链接在这),其网络结构如下:J ` V
这是一p l & d个最典型的卷积网络,由卷积层、池化层、全连接层组成,通过巧妙的设计,利用卷积、参数共享、池化等操作 提取特征,避免了大量的计算成本,最后再使用全连接神经网络进行分类识别,这个网络也是最近大量神经网络架构的起点,给这个领域带来了许多灵感。
详细的论文讲解,可以查看这个博客——大话CNN经典模型:LeNet
可视化的结果:
七、深度学习的本质
在Hinton对深层网络做Pre-Train开始就e K o t / a : A是一个 经验领先于理论分析的偏经验的一门学问,所以很多人戏称为黑盒子。那么深度学习的本质到底是什么呢?我个人更偏向于这种说法——本质就是高维特征变换器,理论上可以做到任意非线性变换。神经网络在5 S . q u ; . o坐标系变换的同时,也顺便充当了信息过滤器。
境界
深度学习目前处于风口,于是很多人想要浑( C A T & a F S水摸鱼,都来分一杯羹,然而可能很多人连深度学习是什么_ L x k y都不知道。所以很多人在自学的时候,又不知道从何学起。下了一堆资料,跑了一堆demo,报了一堆cousera,调调参,看看模型结果不错,就以为入了门,抱歉,可能你连门都没入。深度学习这块,有几个层次:
- d5 , t A V } ( 6 7emo侠:下载了8 c q e目前所有流行的框架,对不同框里的例子都跑一跑,看看结果,觉得不错就行了,进而觉得,嘛,深度学习也不过如此嘛,没有多难啊。在面试的时候经常可以遇到不少,很多学生或者刚转行的上来就是讲一个demk ( Z [ b ao,手写数字识别,cifar10数据的m j 8 I S z Q图像分类等等,然而你问他这个手写数字识别的E [ N / r {具体过程如何实现的?现在效果是不是目前做好的,可以再优化一下吗?为什么激活函数要选这个,可以选别的吗?CNN的原理能简单讲讲吗?懵逼了。
- 调参侠:此类人可能不局限于跑了几个demo,对于模型里的参数也做了一些调整,不管调的好不好,先试了再说,每个都试一下,学习率调大了准确率下降了,那就调小一点,那个参数不知道啥意思,随便改一下值测一下准确率吧。@ F : R 7然要落地,那就对于每一个你熟悉的,常见的模型能够自己手动写代码运行出来,这样对于公司的一些业务,可以对模型进v A J z F行适L Y , F k n当的调整和改动,来适应不d + A : { g [ o f同的业务场景。这也是大多数一二线公司H a ( .的工程师们的现状。r F a o C 然而,对于模型的整体架构能力,超大数据的分布式运行? E [ | Nbuntu18.04深度学习环境配置$ ; 6 } ~ } o _(CUDA9+CUDNN7.4+TensorFlow1.8):https://zhuanlan.zhihu.com/p/50302396
python入门的资料推荐
廖雪峰python学习笔记:https://blog.csdn.net/datawhale/article/category/777995@ f p | w |9
看完这个资料后python基本达到入门水平。
9.2、理论
这绝对是深度学习入门的u s l Y P 7首选课程,没有之一!即便你没有扎实的概率论、线性代6 L W a l ] { F数等数学基础,也能轻松上手这门深度, 4 % 8 Q 6 S o H学习入门课,并体会到无穷趣味。
课程地址:htt5 r # p ; 9psr V / U://mooc.study.163.com/university/deeplearning_ai#/c
9.3、框架
当今深度学习框架有很多,主流3 { @ _的是Google的TensorFlow、Facebook的pytorch还有百度的paddlepaddle,其他的也可以学,这东西多多益善,初学者建议TensorFlo$ _ V g # qw,容易理解一下。
TenC / , [ : t vsorFlow中文社区
深度学习之30分钟快速入门PyTorch(附学习资源推荐)
paddlepaddle中文社区
9.4、论文
推荐这个大博主的正例论文资源——https://blog.csdn.net/zouxy09/article/details/8782018
神经网络游乐场
网站地址:https://dwz.cn/A 6 ( 8 ^ W aji9fh4ae
可以调整:
数据分布,训练集和测试集的比例,有无噪声,批大小;
特征,神经元个数和层数;
学习率,激活函数,正则化与否以及大小,分类还是回归。
你可以尝试去改变相应的参数,从而感受一下网络输出的变化,进而体会到卷积神经网络的乐趣,加油!!!
GitHu0 W 5 ( y Y W + kb标星2000+,如何用30天P K ; C Z Z R n啃完TensorFlow2.0?
清华周界详解《基于图神经网络的事实验证》 | 百9 t ^ m U } y }万人学AI
百年 IBM 终于 All In 人工智能和混合h / W t J | O ?云!
微软为一人收a M B B }购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!
机器学习项目模板:ML项目的6个| L * - # P v ?基本步骤
BM、微软、苹果、谷歌、三星……这些区块链中的科技巨头原来已经做了这么多事!