深度学习笔记(一)

1.1 CNN基本原理

CNN的基本结构包括两层,其一为特征提取层,每一个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之肯定下来;其二是特征映射层,网络的每一个计算层由多个特征映射组成,每一个特征映射是一个平面,平面上全部神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数做为卷积网络的激活函数,使得特征映射具备位移不变性。此外,因为一个映射面上的神经元共享权值,于是减小了网络自由参数的个数。卷积神经网络中的每个卷积层都紧跟着一个用来求局部平均与二次提取的计算层,这种特有的两次特征提取结构减少了特征分辨率。
CNN主要用来识别位移、缩放及其余形式扭曲不变性的二维图形。因为CNN的特征检测层经过训练数据进行学习,因此在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习;再者因为同一特征映射面上的神经元权值相同,因此网络能够并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优点。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享下降了网络的复杂性,特别是多维输入向量的图像能够直接输入网络这一特色避免了特征提取和分类过程当中数据重建的复杂度。git

卷积神经网络是我认为很是好用的一类神经网络结构,当数据具备局部相关性时是一种比较好选择,在图像、天然语言处理、棋类竞技、新药配方研制等方面有普遍应用。
CNN的最大特色就是稀疏链接(局部感觉)和权值共享.左为稀疏链接,右为权值共享。稀疏链接和权值共享能够减小所要训练的参数,减小计算复杂度。
这里写图片描述这里写图片描述
好比,经典的LeNet-5网络结构:
这里写图片描述github

1.1.1 Sigmoid激活函数(下图左)

web

这里写图片描述
优势:可以把输入的连续实值压缩到0到1之间;
缺点:
(1)梯度消失问题(Vanishing Gradient Problem),当输入很是大或很是小的时候,神经元的梯度就接近0了,这使得在反向传播算法中反向传播接近于0的梯度,致使最终权重基本没什么更新;
(2)激活输出非0均值问题 :Sigmoid的输出不是0均值的,这会致使后层的神经元的输入是非0均值的信号,这会对梯度产生影响,假设后层神经元的输入都为正(e.g. x>0elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程当中w要么都往正方向更新,要么都往负方向更新,致使有一种捆绑的效果,使得收敛缓慢。
解决方法:注意参数的初始值设置来避免饱和状况。算法

Tanh函数是另一种Sigmoid函数,它的输出是0均值的(下图右):
这里写图片描述
优势:0均值,可以压缩数据到-1到1之间;
缺点:同Sigmoid缺点第二个,梯度饱和;
这里写图片描述
但这个函数依然解决不了梯度消失问题,后续介绍其余网络结构时会看到在激活函数层面上的演化。网络

CNN的典型特色是:局部相关性(稀疏链接)、权重与偏置共享及采样,一套典型的结构由输入层、卷积层、采样层、全链接层、输出层组成。app

1.1.2 输入层

CNN的输入层通常为一个n维矩阵,能够是图像、向量化后的文本等等。好比一幅彩色图像:
这里写图片描述ide

1.1.3 卷积层

卷积操做在数学上的定义以下: svg

这里写图片描述

这里写图片描述

卷积层的做用:当数据及其周边有局部关联性时能够起到滤波、去噪、找特征的做用;每个卷积核作特征提取获得结果称为feature map,利用不一样卷积核作卷积会获得一系列feature map,这些feature map大小为长宽深度(卷积核的个数)并做为下一层的输入。 函数

以图像处理为例,卷积能够有至少3种理解:布局

  • 平滑
    当设置一个平滑窗口后(如3*3),除了边缘外,图像中每一个像素点都是以某个点为中心的窗口中各个像素点的加权平均值,这样因为每一个点都考虑了周围若干点的特征,因此本质上它是对像素点的平滑。

  • 滤波
    将信号中特定波段频率过滤的操做,是防干扰的一类方法,若是滤波模板(卷积核)是均匀分布,那么滤波就是等权滑动平均,若是模板是高斯分布,那么滤波就是权重分布为钟形的加权滑动平均,不一样的模板能获得图像的不一样滤波后特征。

  • 投影
    卷积是个内积操做,若是把模板(卷积核)拉直后看作一个基向量,那么滑动窗口每滑动一次就会产生一个向量,把这个向量往基向量上作投影就获得feature map,若是模板有多个,则组成一组基,投影后获得一组feature map。

卷积和权重共享能够在保证效果的基础上大大下降模型复杂度,说明以下:
输入层为5*5矩阵,卷积核为3*3矩阵,隐藏层为:3*3矩阵:
这里写图片描述

采用全链接神经网络
参数个数为:5*5*9=225
这里写图片描述

采用局部链接神经网络
隐藏层只与3*3大小的局部像素相连,参数个数为:3*3*9=81
这里写图片描述

采用局部链接权重共享神经网络
全部隐藏层共享权值,且权值为卷积核,参数个数为:3*3*1=9,共享权重的本质含义是对图片某种统计模式的描述,这种模式与图像位置无关。
这里写图片描述

1.1.4 Zero-Padding

Zero-Padding是一种影响输出层构建的方法,思路比较简单:把输入层边界外围用0填充,当咱们但愿输出空间维度和输入空间维度大小同样时能够用此方法,例以下图:当输入为4*4,卷积核为3*3时,利用Zero-Padding可让输出矩阵也是4*4。
这里写图片描述

Zero-Padding一方面让你的网络结构设计更灵活,一方面还能够保留边界信息,不至于随着卷积的过程信息衰减的太快。
你们若是使用Tenserflow会知道它的padding参数有两个值:SAME,表明作相似上图的Zero padding,使得输入的feature map和输出的feature map有相同的大小;VALID,表明不作padding操做。
卷积时有不少种填充图像的方法,如下主要介绍两种,一种是相同填充,一种是有效填充。
这里写图片描述

如图中紫色方框所示,左边是有效填充,右边是相同填充。在相同填充中,超出边界的部分使用补充0的办法,使得输入输出的图像尺寸相同。而在有效填充中,则不使用补充0的方法,不能超出边界,所以每每输入的尺寸大于输出的尺寸。

下图展现了以3x3的网格在28x28的图像上,使用不一样步长、填充方法填充所获得的输出图像的尺寸:
这里写图片描述

下面借助两个动图来理解一下卷积的过程:

第一种是以3x3的网格在5x5的图像上进行有效填充的卷积过程:

这里写图片描述

第二种是使用3x3的网格在5x5图像上进行相同填充的卷积过程,动图在:http://cs231n.github.io/convolutional-networks/

这里写图片描述

回顾整个过程,就是一层一层地增长网络深度,最终获得一个又深又窄的表示,而后把其链接到全链接层,而后训练分类器。

这里写图片描述

1.1.5 采样层(pooling)

经过卷积后。模型的参数规模大幅降低,但对于复杂网络参数个数依然不少,且容易形成过拟合,因此一种天然的方式就是作下采样,采样依然采用滑动窗口方式,经常使用采样有Max-Pooling(将Pooling窗口中的最大值做为采样值)和Mean-Pooling(将Pooling窗口中的全部值相加取平均,用平均值做为采样值),一个例子以下:
这里写图片描述

实际上也有人尝试抛弃Pooling层而采用Stride大于1的卷积层,例如,如下例子中Stride=2,效果相似:
这里写图片描述

另外,若是卷积层的下一层是pooling层,那么每一个feature map都会作pooling,与人类行为相比,pooling能够看作是观察图像某个特征区域是否有某种特性,对这个区域而言不关心这个特性具体表如今哪一个位置(好比:看一我的脸上某个局部区域是否有个痘痘)。

这里写图片描述

经过卷积后,为了引入不变性,同时防止过拟合问题或欠拟合问题、下降计算量,咱们常进行池化处理。池化过程如上图所示。所以池化事后,一般图像的宽度和高度会变成原来的1/2。

其中包括了Max pooling 、 Mean pooling和Stochastic pooling三种池化方法。

两种较为经常使用的是:Max pooling和Mean pooling。Max pooling是选择kernel范围以内的最大值;Mean pooling则是选择kernel范围以内的平均值。

1.1.6 全链接样层

全链接层通常是CNN的最后一层,它是输出层和前面若干层的过渡层,用来组织生成特定节点数的输出层。

1.1.7 参数求解

卷积层在卷积窗口内的像素与下采样层的像素是多对一的关系,即下采样层的一个神经元节点对应的偏差灵敏度对应于上一层卷积层的采样窗口大小的一块像素,下采样层每一个节点的偏差敏感值由上一层卷积层中采样窗口中节点的偏差敏感值联合生成,所以,为了使下采样层的偏差敏感度窗口大小和卷积层窗口(卷积核)大小一致,就须要对下采样层的偏差敏感度作上采样unsampled操做,至关因而某种逆映射操做,对于max-pooling、mean-polling或者各自的加权版原本说处理方法相似

卷积神经网络

在图像处理中,每每把图像表示为像素的向量,好比一个1000×1000的图像,能够表示为一个1000000的向量。在上一节中提到的神经网络中,若是隐含层数目与输入层同样,即也是1000000时,那么输入层到隐含层的参数数据为1000000×1000000=10^12,这样就太多了,基本无法训练。因此图像处理要想练成神经网络大法,必先减小参数加快速度。就跟辟邪剑谱似的,普通人练得很挫,一旦自宫后内力变强剑法变快,就变的很牛了。

局部感知

卷积神经网络有两种神器能够下降参数数目,第一种神器叫作局部感知野。通常认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。于是,每一个神经元其实没有必要对全局图像进行感知,只须要对局部进行感知,而后在更高层将局部的信息综合起来就获得了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。以下图所示:左图为全链接,右图为局部链接。
这里写图片描述
在上右图中,假如每一个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减小为原来的千分之一。而那10×10个像素值对应的10×10个参数,其实就至关于卷积操做。

参数共享

但其实这样的话参数仍然过多,那么就启动第二级神器,即权值共享。在上面的局部链接中,每一个神经元都对应100个参数,一共1000000个神经元,若是这1000000个神经元的100个参数都是相等的,那么参数数目就变为100了。

怎么理解权值共享呢?咱们能够这100个参数(也就是卷积操做)当作是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其余部分是同样的。这也意味着咱们在这一部分学习的特征也能用在另外一部分上,因此对于这个图像上的全部位置,咱们都能使用一样的学习特征。

更直观一些,当从一个大尺寸图像中随机选取一小块,好比说 8×8 做为样本,而且从这个小块样本中学习到了一些特征,这时咱们能够把从这个 8×8 样本中学习到的特征做为探测器,应用到这个图像的任意地方中去。特别是,咱们能够用从 8×8 样本中所学习到的特征跟本来的大尺寸图像做卷积,从而对这个大尺寸图像上的任一位置得到一个不一样特征的激活值。

多卷积核

上面所述只有100个参数时,代表只有1个100*100的卷积核,显然,特征提取是不充分的,咱们能够添加多个卷积核,好比32个卷积核,能够学习32种特征。在有多个卷积核时,以下图所示:

这里写图片描述

上图右,不一样颜色代表不一样的卷积核。每一个卷积核都会将图像生成为另外一幅图像。好比两个卷积核就能够将生成两幅图像,这两幅图像能够看作是一张图像的不一样的通道。以下图所示,下图有个小错误,即将w1改成w0,w2改成w1便可。下文中仍以w1和w2称呼它们。

下图展现了在四个通道上的卷积操做,有两个卷积核,生成两个通道。其中须要注意的是,四个通道上每一个通道对应一个卷积核,先将w2忽略,只看w1,那么在w1的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加而后再取激活函数值获得的。
这里写图片描述
因此,在上图由4个通道卷积获得2个通道的过程当中,参数的数目为4×2×2×2个,其中4表示4个通道,第一个2表示生成2个通道,最后的2×2表示卷积核大小。

Down-pooling

在经过卷积得到了特征 (features) 以后,下一步咱们但愿利用这些特征去作分类。理论上讲,人们能够用全部提取获得的特征去训练分类器,例如 softmax 分类器,但这样作面临计算量的挑战。例如:对于一个 96X96 像素的图像,假设咱们已经学习获得了400个定义在8X8输入上的特征,每个特征和图像卷积都会获得一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,因为有 400 个特征,因此每一个样例 (example) 都会获得一个 892 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,而且容易出现过拟合 (over-fitting)。

为了解决这个问题,首先回忆一下,咱们之因此决定使用卷积后的特征是由于图像具备一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另外一个区域一样适用。所以,为了描述大的图像,一个很天然的想法就是对不一样位置的特征进行聚合统计,例如,人们能够计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不只具备低得多的维度 (相比使用全部提取获得的特征),同时还会改善结果(不容易过拟合)。这种聚合的操做就叫作池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。
这里写图片描述
子采样层中的每一个特征图惟一对应前一层的一个特征图,各特征图组合前一层对应特征图大小相同但互不重叠的全部子区域,使得卷积神经网络具备必定的空间不变性,从而实现必定程度的shift 和 distortion invariance。利用图像局部相关性的原理,对图像进行子抽样,能够减小数据处理量同时保留有用信息。

“若是人们选择图像中的连续范围做为池化区域,而且只是池化相同(重复)的隐藏单元产生的特征,那么,这些池化单元就具备平移不变性 (translation invariant)。”注意这两点:1、连续范围 2、池化相同隐藏单元产生的特征这意思是指,在池化单元内部可以具备平移的不变性,它的平移范围也是有必定范围的,由于每一个池化单元都是连续的,因此可以保证图像总体上发生了平移同样能提取特征进行匹配。不管是max仍是average都是在提取区域特征,均至关于一种抽象,抽象就是过滤掉了没必要要的信息(固然也会损失信息细节),因此在抽象层次上能够进行更好的识别。至于max与average效果是否同样,仍是要看须要识别的图像细节特征状况,这个不必定的,不过听说差别不会超过2%。不过仔细点说的话,评估特征提取的偏差主要来自两个方面:(1)邻域大小受限形成的估计值方差增大,average能减少这种偏差。(2)卷积层参数偏差形成估计均值的偏移,max能减少这种偏差。也就是说,average对背景保留更好,max对纹理提取更好,若是是识别字体什么的,应该考虑max.

多层卷积

在实际应用中,每每使用多层卷积,而后再使用全链接层进行训练,多层卷积的目的是一层卷积学到的特征每每是局部的,层数越高,学到的特征就越全局化。

2.1 LeNet-5

最初的网络结构来源于论文:《Gradient-based learning applied to document recognition》(论文里使用原始未作规范化的数据时,INPUT是32×32的),我用如下结构作说明:
这里写图片描述

LeNet-5一共有8层:1个输入层+3个卷积层(C一、C三、C5)+2个下采样层(S二、S4)+1个全链接层(F6)+1个输出层,每层有多个feature map(自动提取的多组特征)。

在LeNet-5中,输入层是32x32的尺寸。

在第一次卷积中,使用了6个卷积核,获得了C1:6张28x28的特征图。

而后进行下采样,获得S2:特征图宽、高变为原来的1/2,即28/2=14,特征图尺寸变为14x14,特征图张数不变。

再进行第二次卷积,使用了16个卷积核,获得了C3:16张10x10的特征图。

而后进行下采样,获得S4:特征图宽、高变为原来的1/2,即10/2=5,特征图尺寸变为5x5,特征图张数不变。

以后进入卷积层C5,120张1x1全链接后的特征图,与S4全链接。

2.1.1 输入层

采用keras自带的MNIST数据集,输入像素矩阵为28×28的单通道图像数据。

2.1.2 C1卷积层

由6个feature map组成,每一个feature map由5×5卷积核生成(feature map中每一个神经元与输入层的5×5区域像素相连),考虑每一个卷积核的bias,该层须要学习的参数个数为:(5×5+1)×6=156个,神经元链接数为:156×24×24=89856个。

2.1.3 S2下采样层

该层每一个feature map一一对应上一层的feature map,因为每一个单元的2×2感觉野采用不重叠方式移动,因此会产生6个大小为12×12的下采样feature map,若是采用Max Pooling/Mean Pooling,则该层须要学习的参数个数为0个(若是采用非等权下采样——即采样核有权重,则该层须要学习的参数个数为:(2×2+1)×6=30个),神经元链接数为:30×12×12=4320个。

2.1.4 C3卷积层

这层略微复杂,S2神经元与C3是多对多的关系,好比最简单方式:用S3的全部feature map与C3的全部feature map作全链接(也能够对S3抽样几个feature map出来与C3某个feature map链接),这种全链接方式下:6个S2的feature map使用6个独立的5×5卷积核获得C3中1个feature map(生成每一个feature map时对应一个bias),C3中共有16个feature map,因此该层须要学习的参数个数为:(5×5×6+1)×16=2416个,神经元链接数为:2416×8×8=154624个。

2.1.5 S4下采样层

同S2,若是采用Max Pooling/Mean Pooling,则该层须要学习的参数个数为0个,神经元链接数为:(2×2+1)×16×4×4=1280个。

2.1.6 C5卷积层

相似C3,用S4的全部feature map与C5的全部feature map作全链接,这种全链接方式下:16个S4的feature map使用16个独立的1×1卷积核获得C5中1个feature map(生成每一个feature map时对应一个bias),C5中共有120个feature map,因此该层须要学习的参数个数为:(1×1×16+1)×120=2040个,神经元链接数为:2040个。

2.1.7 F6全链接层

将C5层展开获得4×4×120=1920个节点,并接一个全链接层,考虑bias,该层须要学习的参数和链接个数为:(1920+1)*84=161364个。

2.1.8 输出层

该问题是个10分类问题,因此有10个输出单元,经过softmax作几率归一化,每一个分类的输出单元对应84个输入。

Minist(Modified NIST)数据集下使用LeNet-5的训练可视化:
这里写图片描述