深度学习笔记1:神经网络 卷积神经网络

时间:2022-12-25 23:57:30

1、神经网络

神经网络简介

        神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。神经元为神经网络中的基本组成单位,

        下图为单个神经元的图片,如图所示,每个神经元的输入包含多个变量x1——xn以及一个偏置值b,同时输出h(x) = f(w1*x1+w2*x2+w3*x3+b),f(x)称激活函数。激活函数是用来加入非线性因素的,因为线性模型的表达能力不够(若采用性激活函数,将网络的多层展开,会发现都只是相当于一层的结果)。

深度学习笔记1:神经网络 卷积神经网络

常见的激活函数有sigmoid函数深度学习笔记1:神经网络 卷积神经网络,双曲正切函数深度学习笔记1:神经网络 卷积神经网络,其函数图像如下图所示。

深度学习笔记1:神经网络 卷积神经网络

神经网络模型

        将许多神经元连接在一起,某些神经元的输出为另一些神经元的输入,就可以构成神经网络。如下图,为一个简单的三层神经网络。


深度学习笔记1:神经网络 卷积神经网络

        图中每一个圆代表一个神经元的输入,写有b的圆代表偏置项。图中最左边的层称为输入层,我们图中的神经网络有三个输入单元。最右边一层成为输出层,输出层可以有一个结点,也可以有多个结点,表示整个网络的输出。其他中间的层成为隐含层。  

        我这里用ali表示第l层第i个单元的激活值,即a22表示第二层第二个神经元的激活值;用Wijl表示第l层第i个神经元和第l+1层第j个神经元之间的连接参数;用bl表示第l层的偏置参数。则在我们的网络中第2层的神经元可以如下公式计算。

深度学习笔记1:神经网络 卷积神经网络

        输出层深度学习笔记1:神经网络 卷积神经网络

2、反向传播算法http://blog.csdn.net/l691899397/article/details/52223998损失函数        损失函数在统计学中是一种衡量损失和误差程度的函数,它一般包括损失项(loss term)和正则项(regularization term)深度学习笔记1:神经网络 卷积神经网络
损失项        损失项比较常见的有平方损失深度学习笔记1:神经网络 卷积神经网络,常用在回归问题;以及对数损失函数深度学习笔记1:神经网络 卷积神经网络,常用在分类问题。    正则项        加入正则项目的是减小权重的幅度,防止过度拟合。常用的有L1-regularization和L2-regularization。深度学习也有一个目标函数,通过这个目标函数我们可以知道参数为何值时对我们来说才是一组“好”的参数,这个函数就是损失函数。训练的过程就是通过每一次迭代对网络中参数进行更新,来使损失函数的值达到最小
BackPropagation算法(BP)
BP算法的整体思路如下:对于每个给定的训练样本,首先进行前向计算,计算出网络中每一层的激活值和网络的输出。对于最后一层(输出层),我们可以直接计算出网络的输出值与已经给出的标签值(label)直接的差距,我们将这个值定义为残差δ。对于输出层之前的隐藏层L,我们将根据L+1层各节点的加权平均值来计算第L层的残差。在反向传播过程中,若第x层的a节点通过权值W对x+1层的b节点有贡献,则在反向传播过程中,梯度通过权值W从b节点传播回a节点。
反向传播的具体步骤如下:(1)根据输入,计算出每一层的激活值。(2)对于输出层,计算每个单元的残差(3)对于输出层之前的每一层,计算每一层的残差(4)由残差计算每一层的偏导数(5)最后,使用偏导数更新权值和偏置。

3、卷积神经网络(Convolutional Neural Networks)它的权值共享网络结构,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征。网络结构      卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。深度学习笔记1:神经网络 卷积神经网络
      输入图像通过和三个可训练的滤波器和可加偏置进行卷积,滤波过程如上图,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。这些映射图再进过滤波得到C3层。这个层级结构再和S2一样产生S4。最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。       一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。由于一个映射面上的神经元共享权值,因而减少了网络*参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。关于参数减少与权值共享感受野http://www.cnblogs.com/objectDetect/p/5947169.html从CNN可视化的角度来讲,就是卷积神经网络每一层输出的特征图(featuremap)某个节点的响应对应的原始输入图像的区域就是感受野,即feature map上的像素点在原始图像上映射的区域大小。感受野计算时有下面的几个情况需要说明:  (1)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小  (2)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系  (3)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小这里的每一个卷积层还有一个strides的概念,这个strides是之前所有层stride的乘积。  即strides(i) = stride(1) * stride(2) * ...* stride(i-1)  关于感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:      RF = 1 #待计算的feature map上的感受野大小  for layer in (top layer To down layer):    RF = ((RF -1)* stride) + fsizestride 表示卷积的步长; fsize表示卷积层滤波器的大小  用python实现了计算Alexnet zf-5和VGG16网络每层输出feature map的感受野大小
图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。   

假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即10^8个参数。比原来减少了四个0(数量级)。我们知道,隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数。那如果我们每个神经元这100个参数是相同的呢?也就是说每个神经元用的是同一个卷积核去卷积图像。这样我们就只有100个参数啊!不管你隐层的神经元个数有多少,两层间的连接只有100个参数!这就是权值共享!但这样你只提取了一种特征。假如一种滤波器,也就是一种卷积核就是提出图像的一种特征,例如某个方向的边缘。那么我们需要提取不同的特征,只需加多几种滤波器就行了。所以假设我们加到100种滤波器,每种滤波器的参数不一样,表示它提出输入图像的不同特征,例如不同的边缘。这样每种滤波器去卷积图像就得到对图像的不同特征的放映,我们称之为Feature Map。所以100种卷积核就有100个Feature Map。这100个Feature Map就组成了一层神经元。我们这一层有多少个参数了?100种卷积核x每种卷积核共享100个参数=100x100=10K,也就是1万个参数。
深度学习笔记1:神经网络 卷积神经网络
刚才说隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。那么隐层的神经元个数怎么确定呢?它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了。注意了,这只是一种滤波器,也就是一个Feature Map的神经元个数,如果100个Feature Map就是100倍了。由此可见,图像越大,神经元个数和需要训练的权值参数个数的贫富差距就越大。

深度学习笔记1:神经网络 卷积神经网络


卷积层的权值共享是指每一个map局部和整体权值共享,具体表现出来就是每一个map与卷积核进行卷积,卷积核在map上移动map的不同局部区域之间使用的同一个卷积核进行计算,而不是多个map使用相同的卷积核。
总之,卷积网络的核心思想是将:局部感受野、权值共享(或者权值复制)以及时间或空间亚采样这三种结构思想结合起来获得了某种程度的位移、尺度、形变不变性。

实现一个卷积神经网络
设计的网络结构如下图所示:包含2个卷积层,2个max池化层,2个全链接层和1个relu层与一个softmax层。深度学习笔记1:神经网络 卷积神经网络

卷积层的输入来源于输入层或者pooling层。每一层的多个卷积核大小相同,在这个网络中,使用的卷积核均为5*5。

下面我来推导一下每层的神经元数目和参数的个数。1、输入层:输入层输入一个28*28的图片。2、卷积层1:该层使用20个5*5的卷积核分别对输入层图片进行卷积,所以包含20*5*5=500个参数权值参数。卷积后图片边长为(28-5+1)/1 = 24,故产生20个24*24个map,包含20*24*24 = 11520个神经元。3、池化(pooling)层1:对上一层每个2*2区域进行降采样,选取每个区域最大值,这一层没有参数。降采样过后每个map的长和宽变为原来的一半。4、卷积层2:该层使用20*50个5*5的卷积核分别对上一层的每一个map进行卷积,所以包含20*50*5*5=25000个参数权值参数。卷积后图片边长为(12-5+1)/1 = 8,故产生50个8*8个map,包含50*8*8 = 3200个神经元。5、池化层2:和上一个池化层功能类似,将8*8的map降采样为4*4的map。该层无参数。6、全连接层1:将上一层的所有神经元进行连接,该层含有500个神经元,故一共有50*4*4*500 = 400000个权值参数。7、relu层:激活函数层,实现x=max[0,x],该层神经元数目和上一层相同,无权值参数。8、全连接层2:功能和上一个全连接层类似,该层共有10个神经元,包含500*10=5000个参数。9、softmax层:实现分类和归一化

卷积层的前向计算如图输入为28*28的图像,经过5*5的卷积之后,得到一个 24*24的map。卷积层2的每个map是不同卷积核在前一层每个map上进行卷积,并将每个对应位置上的值相加然后再加上一个偏置项。深度学习笔记1:神经网络 卷积神经网络
每次用卷积核与map中对应元素相乘,然后移动卷积核进行下一个神经元的计算。如图中矩阵C的第一行第一列的元素2,就是卷积核在输入map左上角时的计算结果。在图中也很容易看到,输入为一个4*4的map,经过2*2的卷积核卷积之后,结果为一个(4-2+1) *(4-2+1) = 3*3的map。
卷积层的后向计算前面提到:在反向传播过程中,若第x层的a节点通过权值W对x+1层的b节点有贡献,则在反向传播过程中,梯度通过权值W从b节点传播回a节点。卷积层的反向传播过程也是如此,我们只需要找出卷积层L中的每个单元和L+1层中的哪些单元相关联即可。我们还用上边的图片举例子。在上图中,我们的矩阵A11通过权重B11与C11关联。而A12与2个矩阵C中2个元素相关联,分别是通过权重B12和C11关联,和通过权重B11和C12相关联。矩阵A中其他元素也类似。那么,我们有没有简单的方法来实现这样的关联呢。答案是有的。可以通过将卷积核旋转180度,再与扩充后的梯度矩阵进行卷积。扩充的过程如下:如果卷积核为k*k,待卷积矩阵为n*n,需要以n*n原矩阵为中心扩展到(n+2(k-1))*(n+2(k-1))。具体过程如下:假设D为反向传播到卷积层的梯度矩阵,则D应该与矩阵C的大小相等,在这里为3*3。我们首先需要将它扩充到(3+2*(2-1))* (3+2*(2-1)) = 5*5大小的矩阵,
深度学习笔记1:神经网络 卷积神经网络
同时将卷积核B旋转180度:深度学习笔记1:神经网络 卷积神经网络

将旋转后的卷积核与扩充后的梯度矩阵进行卷积:深度学习笔记1:神经网络 卷积神经网络


一种典型的用来识别数字的卷积网络是LeNet-5,详见此文章
关于里面涉及到的池化和全连接介绍,详见下面文章