零基础⼊门深度学习(4)-卷积神经⽹络
⽆论即将到来的是⼤数据时代还是⼈⼯智能时代,亦或是传统⾏业使⽤⼈⼯智能在云上处理⼤数据的时代,作为⼀个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就out了?现在救命稻草来了,《零基础⼊门深度学习》系列⽂章旨在讲帮助爱编程的你从零基础达到⼊门级⽔平。零基础意味着你不需要太多的数学知识,只要会写程序就⾏了,没错,这是专门为程序员写的⽂章。虽然⽂中会有很多公式你也许看不懂,但同时也会有更多的代码,程序员的你⼀定能看懂的(我周围是⼀狂热的Clean Code程序员,所以我写的代码也不会很差)。
⽂章列表
往期回顾
在前⾯的⽂章中,我们介绍了全连接神经⽹络,以及它的训练和使⽤。我们⽤它来识别了⼿写数字,然⽽,这种结构的⽹络对于图像识别任务来说并不是很合适。本⽂将要介绍⼀种更适合图像、语⾳识别任务的神经⽹络结构——卷积神经⽹络(Convolutional Neural Network, CNN)。说卷积神经⽹络是最重要的⼀种神经⽹络也不为过,它在最近⼏年⼤放异彩,⼏乎所有图像、语⾳识别领域的重要突破都是卷积神经⽹络取得的,⽐如⾕歌的GoogleNet、微软的ResNet等,打败李世⽯的AlphaGo也⽤到了这种⽹络。本⽂将详细介绍卷积神经⽹络以及它的训练算法,以及动⼿实现⼀个简单的卷积神经⽹络。
零基础自学什么好
⼀个新的激活函数——Relu
最近⼏年卷积神经⽹络中,激活函数往往不选择sigmoid或tanh函数,⽽是选择relu函数。Relu函数的定义是:
f( x ) = max(0 , x)
Relu函数图像如下图所⽰:
Relu函数作为激活函数,有下⾯⼏⼤优势:
稀疏性 通过对⼤脑的研究发现,⼤脑在⼯作的时候只有⼤约5%的神经元是激活的,⽽采⽤sigmoid激活函数的⼈⼯神经⽹络,其激活率⼤约是50%。有论⽂声称⼈⼯神经⽹络在15%-30%的激活率时是⽐较理想的。因为relu函数在输⼊⼩于0时是完全不激活的,因此可以获得⼀个更低的激活率。
全连接⽹络 VS 卷积⽹络
全连接神经⽹络之所以不太适合图像识别任务,主要有以下⼏个⽅⾯的问题:
参数数量太多 考虑⼀个输⼊1000*1000像素的图⽚(⼀百万像素,现在已经不能算⼤图了),输⼊层有1000*1000=100万节点。假设第⼀个隐藏层有100个节点(这个数量并不多),那么仅这⼀层就有(1000*1000+1)*100=1亿参数,这实在是太多了!我们看到图像只扩⼤⼀点,参数数量就会多很多,因此它的扩展性很差。
没有利⽤像素之间的位置信息 对于图像识别任务来说,每个像素和其周围像素的联系是⽐较紧密的,和离得很远的像素的联系可能就很⼩了。如果⼀个神经元和上⼀层所有神经元相连,那么就相当于对于⼀个像素来说,把图像的所有像素都等同看待,这不符合前⾯的假设。当我们完成每个连接权重的学习之后,最终可能会发现,有⼤量的权重,它们的值都是很⼩的(也就是这些连接其实⽆关紧要)。
努⼒学习⼤量并不重要的权重,这样的学习必将是⾮常低效的。
⽹络层数限制 我们知道⽹络层数越多其表达能⼒越强,但是通过梯度下降⽅法训练深度全连接神经⽹络很困难,因为全连接神经⽹络的梯度很难传递超过3层。因此,我们不可能得到⼀个很深的全连接神经⽹络,也就限制了它的能⼒。
那么,卷积神经⽹络⼜是怎样解决这个问题的呢?主要有三个思路:
局部连接 这个是最容易想到的,每个神经元不再和上⼀层的所有神经元相连,⽽只和⼀⼩部分神经元相连。这样就减少了很多参数。
权值共享 ⼀组连接可以共享同⼀个权重,⽽不是每个连接有⼀个不同的权重,这样⼜减少了很多参数。
下采样 可以使⽤Pooling来减少每层的样本数,进⼀步减少参数数量,同时还可以提升模型的鲁棒性。
对于图像识别任务来说,卷积神经⽹络通过尽可能保留重要的参数,去掉⼤量不重要的参数,来达到更好的学习效果。
接下来,我们将详述卷积神经⽹络到底是何⽅神圣。
卷积神经⽹络是啥
⾸先,我们先获取⼀个感性认识,下图是⼀个卷积神经⽹络的⽰意图:
⽹络架构
如图1所⽰,⼀个卷积神经⽹络由若⼲卷积层、Pooling层、全连接层组成。你可以构建各种不同的卷积神经⽹络,它的常⽤架构模式为:INPUT -> [[CONV]*N -> POOL?]*M -> [FC]*K
也就是N个卷积层叠加,然后(可选)叠加⼀个Pooling层,重复这个结构M次,最后叠加K个全连接层。
对于图1展⽰的卷积神经⽹络:
INPUT -> CONV -> POOL -> CONV -> POOL -> FC -> FC
按照上述模式可以表⽰为:
INPUT -> [[CONV]*1 -> POOL]*2 -> [FC]*2
也就是:N=1, M=2, K=2。
三维的层结构
从图1我们可以发现卷积神经⽹络的层结构和全连接神经⽹络的层结构有很⼤不同。全连接神经⽹络每层的神经元是按照⼀维排列的,也就是排成⼀条线的样⼦;⽽卷积神经⽹络每层的神经元是按照三维排列的,也就是排成⼀个长⽅体的样⼦,有宽度、⾼度和深度。
对于图1展⽰的神经⽹络,我们看到输⼊层的宽度和⾼度对应于输⼊图像的宽度和⾼度,⽽它的深度为1。接着,第⼀个卷积层对这幅图像进⾏了卷积操作(后⾯我们会讲如何计算卷积),得到了三个Feature Map。这⾥的"3"可能是让很多初学者迷惑的地⽅,实际上,就是这个卷积层包含三个Filter,也就是三套参数,每个Filter都可以把原始输⼊图像卷积得到⼀个Feature Map,三个Filter就可以得到三个Feature Map。⾄于⼀个卷积层可以有多少个Filter,那是可以⾃由设定的。也就是说,卷积层的Filter个数也是⼀个超参数。我们可以把Feature Map可以看做是通过卷积变换提取到的图像特征,三个Filter就对原始图像提取出三组不同的特征,也就是得到了三个Feature Map,也称做三个通道(channel)。
继续观察图1,在第⼀个卷积层之后,Pooling层对三个Feature Map做了下采样(后⾯我们会讲如何计算下采样),得到了三个更⼩的Feature Map。接着,是第⼆个卷积层,它有5个Filter。每个Fitler都把前⾯下采样之后的3个**Feature Map卷积在⼀起,得到⼀个新的Feature Map。这样,5个Filter就得到了5个Feature Map。接着,是第⼆个Pooling,继续对5个Feature Map进⾏下采样**,得到了5个更⼩的Feature Map。
图1所⽰⽹络的最后两层是全连接层。第⼀个全连接层的每个神经元,和上⼀层5个Feature Map中的每个神经元相连,第⼆个全连接层(也就是输出层)的每个神经元,则和第⼀个全连接层的每个神经元相连,这样得到了整个⽹络的输出。
⾄此,我们对卷积神经⽹络有了最基本的感性认识。接下来,我们将介绍卷积神经⽹络中各种层的计算和训练。
卷积神经⽹络输出值的计算
卷积层输出值的计算
我们⽤⼀个简单的例⼦来讲述如何计算卷积,然后,我们抽象出卷积层的⼀些重要概念和计算⽅法。
假设有⼀个5*5的图像,使⽤⼀个3*3的filter进⾏卷积,想得到⼀个3*3的Feature Map,如下所⽰:
可以依次计算出Feature Map中所有元素的值。下⾯的动画显⽰了整个Feature Map的计算过程:
上⾯的计算过程中,步幅(stride)为1。步幅可以设为⼤于1的数。例如,当步幅为2时,Feature Map计算如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。