张量和卷积神经网络
什么是张量
几何代数中定义的张量是基于向量和矩阵的推广,通俗一点理解的话,我们可以将标量视为零阶张量,矢量视为一阶张量,那么矩阵就是二阶张量。
矩阵乘积 (matmul product)
设A为m*p的矩阵,B为p*n 的矩阵,那么称m*n的矩阵C为矩阵A与B的乘积,
记作 C = AB
其中矩阵C中的第 行第 列元素可以表示为:
哈达马积 (hadamard product)
m*n矩阵 A 与m*n矩阵 B 的Hadamard积记为A*B.
其元素定义为两个矩阵对应元素的乘积:
克罗内克积 (Kronecker product)
Kronecker积是两个任意大小的矩阵间的运算,又称为直积或张量积
什么是卷积神经网络
CNN:是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。
图像特征抽取CNN的基本结构
图中是一个图形识别的CNN模型。可以看出最左边的船的图像就是我们的输入层,计算机理解为输入若干个矩阵,这点和DNN基本相同。
接着是卷积层(Convolution Layer),这个是CNN特有的,我们后面专门来讲。卷积层的激活函数使用的是ReLU。我们在DNN中介绍过ReLU的激活函数,它其实很简单,就是ReLU(x)=max(0,x)ReLU(x)=max(0,x)。在卷积层后面是池化层(Pooling layer),这个也是CNN特有的,我们后面也会专门来讲。需要注意的是,池化层没有激活函数。
卷积层+池化层的组合可以在隐藏层出现很多次,上图中出现两次。而实际上这个次数是根据模型的需要而来的。当然我们也可以灵活使用使用卷积层+卷积层,或者卷积层+卷积层+池化层的组合,这些在构建模型的时候没有限制。但是最常见的CNN都是若干卷积层+池化层的组合,如上图中的CNN结构。
在若干卷积层+池化层后面是全连接层(Fully Connected Layer, 简称FC),全连接层其实就是我们前面讲的DNN结构,只是输出层使用了Softmax激活函数来做图像识别的分类,这点我们在DNN中也有讲述。
从上面CNN的模型描述可以看出,CNN相对于DNN,比较特殊的是卷积层和池化层,如果我们熟悉DNN,只要把卷积层和池化层的原理搞清楚了,那么搞清楚CNN就容易很多了。
初识卷积
首先,我们去学习卷积层的模型原理,在学习卷积层的模型原理前,我们需要了解什么是卷积,以及CNN中的卷积是什么样子的。
大家学习数学时都有学过卷积的知识,微积分中卷积的表达式为:
S(t)=∫x(t−a)w(a)daS(t)=∫x(t−a)w(a)da
离散形式是:
s(t)=∑ax(t−a)w(a)s(t)=∑ax(t−a)w(a)
这个式子如果用矩阵表示可以为:
s(t)=(X∗W)(t)s(t)=(X∗W)(t)
其中星号表示卷积。
如果是二维的卷积,则表示式为:
s(i,j)=(X∗W)(i,j)=∑m∑nx(i−m,j−n)w(m,n)s(i,j)=(X∗W)(i,j)=∑m∑nx(i−m,j−n)w(m,n)
在CNN中,虽然我们也是说卷积,但是我们的卷积公式和严格意义数学中的定义稍有不同,比如对于二维的卷积,定义为:
s(i,j)=(X∗W)(i,j)=∑m∑nx(i+m,j+n)w(m,n)s(i,j)=(X∗W)(i,j)=∑m∑nx(i+m,j+n)w(m,n)
这个式子虽然从数学上讲不是严格意义上的卷积,但是大牛们都这么叫了,那么我们也跟着这么叫了。后面讲的CNN的卷积都是指的上面的最后一个式子。
其中,我们叫W为我们的卷积核,而X则为我们的输入。如果X是一个二维输入的矩阵,而W也是一个二维的矩阵。但是如果X是多维张量,那么W也是一个多维的张量。
CNN中的卷积层
有了卷积的基本知识,我们现在来看看CNN中的卷积,假如是对图像卷积,回想我们的上一节的卷积公式,其实就是对输出的图像的不同局部的矩阵和卷积核矩阵各个位置的元素相乘,然后相加得到。
举个例子如下,图中的输入是一个二维的3x4的矩阵,而卷积核是一个2x2的矩阵。这里我们假设卷积是一次移动一个像素来卷积的,那么首先我们对输入的左上角2x2局部和卷积核卷积,即各个位置的元素相乘再相加,得到的输出矩阵S的S00S00的元素,值为aw+bx+ey+fzaw+bx+ey+fz。接着我们将输入的局部向右平移一个像素,现在是(b,c,f,g)四个元素构成的矩阵和卷积核来卷积,这样我们得到了输出矩阵S的S01S01的元素,同样的方法,我们可以得到输出矩阵S的S02,S10,S11,S12S02,S10,S11,S12的元素。
最终我们得到卷积输出的矩阵为一个2x3的矩阵S。
再举一个:这里面输入是3个7x7的矩阵。实际上原输入是3个5x5的矩阵。只是在原来的输入周围加上了1的padding,即将周围都填充一圈的0,变成了3个7x7的矩阵。
例子里面使用了两个卷积核,我们先关注于卷积核W0。和上面的例子相比,由于输入是3个7x7的矩阵,或者说是7x7x3的张量,则我们对应的卷积核W0也必须最后一维是3的张量,这里卷积核W0的单个子矩阵维度为3x3。那么卷积核W0实际上是一个3x3x3的张量。同时和上面的例子比,这里的步幅为2,也就是每次卷积后会移动2个像素的位置。
最终的卷积过程和上面的2维矩阵类似,上面是矩阵的卷积,即两个矩阵对应位置的元素相乘后相加。这里是张量的卷积,即两个张量的3个子矩阵卷积后,再把卷积的结果相加后再加上偏倚b。
7x7x3的张量和3x3x3的卷积核张量W0卷积的结果是一个3x3的矩阵。由于我们有两个卷积核W0和W1,因此最后卷积的结果是两个3x3的矩阵。或者说卷积的结果是一个3x3x2的张量。
仔细回味下卷积的过程,输入是7x7x3的张量,卷积核是两个3x3x3的张量。卷积步幅为2,最后得到了输出是3x3x2的张量。如果把上面的卷积过程用数学公式表达出来就是:
s(i,j)=(X∗W)(i,j)+b=∑k=1n_in(Xk∗Wk)(i,j)+bs(i,j)=(X∗W)(i,j)+b=∑k=1n_in(Xk∗Wk)(i,j)+b
其中,n_inn_in为输入矩阵的个数,或者是张量的最后一维的维数。XkXk代表第k个输入矩阵。WkWk代表卷积核的第k个子卷积核矩阵。s(i,j)s(i,j)即卷积核WW对应的输出矩阵的对应位置元素的值。
对于卷积后的输出,一般会通过ReLU激活函数,将输出的张量中的小于0的位置对应的元素值都变为0。
CNN中的池化层
相比卷积层的复杂,池化层则要简单的多,所谓的池化,个人理解就是对输入张量的各个子矩阵进行压缩。假如是2x2的池化,那么就将子矩阵的每2x2个元素变成一个元素,如果是3x3的池化,那么就将子矩阵的每3x3个元素变成一个元素,这样输入矩阵的维度就变小了。
要想将输入子矩阵的每nxn个元素变成一个元素,那么需要一个池化标准。常见的池化标准有2个,MAX或者是Average。即取对应区域的最大值或者平均值作为池化后的元素值。
下面这个例子采用取最大值的池化方法。同时采用的是2x2的池化。步幅为2。
首先对红色2x2区域进行池化,由于此2x2区域的最大值为6.那么对应的池化输出位置的值为6,由于步幅为2,此时移动到绿色的位置去进行池化,输出的最大值为8.同样的方法,可以得到黄色区域和蓝色区域的输出值。最终,我们的输入4x4的矩阵在池化后变成了2x2的矩阵。进行了压缩。
卷积神经网络(CNN)张量(图像)的尺寸和参数计算
以AlexNet网络为例,以下是该网络的参数结构图
AlexNet网络的层结构如下:
1.Input: 图像的尺寸是227*227*3.
2.Conv-1: 第1层卷积层的核大小11*11,96个核。步长(stride)为4,边缘填充(padding)为0。
3.MaxPool-1: 池化层-1对Conv-1进行池化,尺寸为3*3,步长为2.
4.Conv-2: 核尺寸:5*5,数量:256,步长:1,填充:2
5.MaxPool-2: 尺寸:3*3,步长:2
6.Conv-3: 核尺寸:3*3,数量:384,步长:1,填充:1
7: Conv-4: 结构同Conv-3.
8. Conv-5: 核尺寸:3*3,数量:256,步长:1,填充:1
9. MaxPool-3: 尺寸:3*3,步长:2
10.FC-1: 全连接层1共有4096个神经元。
11.FC-1: 全连接层2共有4096个神经元。
12.FC-3: 全连接层3共有1000个神经元。
接下来,我们对以上的网络结构进行描述:
1.如何计算张量(图像)的尺寸;
2.如何计算网络的总参数;
卷积层(Conv Layer)的输出张量(图像)的大小
定义如下:
O=输出图像的尺寸。
I=输入图像的尺寸。
K=卷积层的核尺寸
N=核数量
S=移动步长
P =填充数
输出图像尺寸的计算公式如下:
输出图像的通道数等于核数量N。
示例:AlexNet中输入图像的尺寸为227*227*3.第一个卷积层有96个尺寸为11*11*3的核。步长为4,填充为0.
输出的图像为55*55*96(每个核对应1个通道)。
池化层(MaxPool Layer)的输出张量(图像)的大小
定义如下:
O=输出图像的尺寸。
I=输入图像的尺寸。
S=移动步长
PS=池化层尺寸
输出图像尺寸的计算公式如下:
不同于卷积层,池化层的输出通道数不改变。
示例:每1层卷积层后的池化层的池化层尺寸为3*3,步长为2。根据前面卷积层的输出为55*55*96。池化层的输出图像尺寸如下:
输出尺寸为27*27*96。
全连接层(Fully Connected Layer)的输出张量(图像)的大小
全连接层输出向量长度等于神经元的数量。
通过AlexNet改变张量(图像)的尺寸的结构如下:
在AlexNet网络中,输出的图像尺寸为227*227*3.
Conv-1,尺寸变为55*55*96,池化层后变为27*27*96。
Conv-2,尺寸变为27*27*256,池化层后变为13*13*256.
Conv-3,尺寸变为13*13*384,经过Conv-4和Conv-5变回13*13*256.
最后,MaxPool-3尺寸缩小至6*6*256.
图像通过FC-1转换为向量4096*1.通过FC-2尺寸未改变.最终,通过FC-3输出1000*1的尺寸张量.
接下来,计算每层的参数数量.
Conv Layer参数数量
在CNN中,每层有两种类型的参数:weights 和biases.总参数数量为所有weights和biases的总和.
定义如下:
WC=卷积层的weights数量
BC=卷积层的biases数量
PC=所有参数的数量
K=核尺寸
N=核数量
C =输入图像通道数
卷积层中,核的深度等于输入图像的通道数.于是每个核有K*K个参数.并且有N个核.由此得出以下的公式.
示例:AlexNet网络中,第1个卷积层,输入图像的通道数(C)是3,核尺寸(K)是11*11,核数量是96. 该层的参数计算如下:
计算出Conv-2, Conv-3, Conv-4, Conv-5 的参数分别为 614656 , 885120, 1327488 和884992.卷积层的总参数就达到3,747,200.
MaxPool Layer参数数量
没有与MaxPool layer相关的参数量.尺寸,步长和填充数都是超参数.
Fully Connected (FC) Layer参数数量
在CNN中有两种类型的全连接层.第1种是连接到最后1个卷积层,另外1种的FC层是连接到其他的FC层.两种情况我们分开讨论.
类型1:连接到Conv Layer
定义如下:
Wcf= weights的数量
Bcf= biases的数量
O= 前卷积层的输出图像的尺寸
N = 前卷积层的核数量
F = 全连接层的神经元数量
示例: AlexNet网络中第1个FC层连接至Conv Layer.该层的O为6,N为256,F为4096.
参数数目远大于所有Conv Layer的参数和.
类型2:连接到FC Layer
定义如下:
Wff= weights的数量
Bff= biases的数量
Pff= 总参数的数量
F= 当前FC层的神经元数量
F-1= 前FC层的神经元数量
示例:AlexNet的最后1个全连接层, F-1=4096,F=1000.
AlexNet网络中张量(图像)尺寸和参数数量
AlexNet网络中总共有5个卷积层和3个全连接层.总共有62,378,344个参数.以下是汇总表.
基于【Tensorflow】实现的卷积神经网络CNN模型
TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流图的一端流动到另一端计算过程。TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统。TensorFlow可被用于语音识别或图像识别等多项机器深度学习领域,对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。