卷积神经网络

在介绍TensorFlow卷积之前,先介绍一下卷积在的常用的一些步骤,卷积在深度学习中占用非常重要的地位。对于卷积的介绍,这里有三篇文章向大家推荐一下,对于入门卷积的同学非常有帮助,卷积神经网络

从上图可以发现,使用卷积处理图片的流程,输入图片---->卷积----->池化----->卷积----->池化----->全连接,这个结构在卷积神经网络中也经常可以见到,下面简单的介绍一下这几个步骤。

1、输入层

输入层:在卷积神经网络中,输入层通常都是一张图片,只是计算机理解的输入的图片与我们所看到的图片有所不同,计算机会将一张图片理解成一个像素矩阵。上图中的输入图片也就是一个像素矩阵,其中矩阵的长和宽代表了图片的大小,矩阵的维度代表了图像的通道数,一般图片的通道数为1或者3,1代表的是黑白图片,3代表的是RGB彩色图片。

2、卷积层

卷积层:卷积层是卷积神经网络中最重要的部分,卷积层与之前所介绍的神经网的全连接有所不同。在之前的使用神经网络识别手写数字的实例中,每张图片的大小是28*28,我们需要784个参数,每一个像素都对应了一个参数,而且这还是1通道的图片,如果是3通道的图片,参数的大小要增加3倍,而且在实际生活中的图片都是高清的,远大于28*28可见参数也要成倍增长,而且参数过多还可能导致过拟合的发生。而卷积,可以大大减少参数数量和减少过拟合的情况,卷积使用的是一种局部连接的方式,采用的是权值共享,参数的个数与所选择的卷积核的有关,常见的卷积核有3*3,5*5等,通常是奇数的,当然1*1作为卷积核也是有的。卷积层是将图片中的每一小块进行更加深入的分析从而抽象到更高程度的特征。一般来说,通过卷积层处理之后节点矩阵会变得更深,下面用一张图简单的展示一下卷积处理像素矩阵的过程。

卷积神经网络

从这张图可以发现,位于左边的矩阵就是输入的图像像素矩阵,位于右边的就是经过卷积之后的图像像素矩阵,黄色3*3大小的矩阵就是卷积核,卷积核每次都会向右移动一个步长,

在介绍TensorFlow卷积之前,先介绍一下卷积在的常用的一些步骤,卷积在深度学习中占用非常重要的地位。对于卷积的介绍,这里有三篇文章向大家推荐一下,对于入门卷积的同学非常有帮助,

从上图可以发现,使用卷积处理图片的流程,输入图片---->卷积----->池化----->卷积----->池化----->全连接,这个结构在卷积神经网络中也经常可以见到,下面简单的介绍一下这几个步骤。

1、输入层

输入层:在卷积神经网络中,输入层通常都是一张图片,只是计算机理解的输入的图片与我们所看到的图片有所不同,计算机会将一张图片理解成一个像素矩阵。上图中的输入图片也就是一个像素矩阵,其中矩阵的长和宽代表了图片的大小,矩阵的维度代表了图像的通道数,一般图片的通道数为1或者3,1代表的是黑白图片,3代表的是RGB彩色图片。

2、卷积层

卷积层:卷积层是卷积神经网络中最重要的部分,卷积层与之前所介绍的神经网的全连接有所不同。在之前的使用神经网络识别手写数字的实例中,每张图片的大小是28*28,我们需要784个参数,每一个像素都对应了一个参数,而且这还是1通道的图片,如果是3通道的图片,参数的大小要增加3倍,而且在实际生活中的图片都是高清的,远大于28*28可见参数也要成倍增长,而且参数过多还可能导致过拟合的发生。而卷积,可以大大减少参数数量和减少过拟合的情况,卷积使用的是一种局部连接的方式,采用的是权值共享,参数的个数与所选择的卷积核的有关,常见的卷积核有3*3,5*5等,通常是奇数的,当然1*1作为卷积核也是有的。卷积层是将图片中的每一小块进行更加深入的分析从而抽象到更高程度的特征。一般来说,通过卷积层处理之后节点矩阵会变得更深,下面用一张图简单的展示一下卷积处理像素矩阵的过程。

卷积神经网络

从这张图可以发现,位于左边的矩阵就是输入的图像像素矩阵,位于右边的就是经过卷积之后的图像像素矩阵,黄色3*3大小的矩阵就是卷积核,卷积核每次都会向右移动一个步长,计算方式是,卷积核与图像像素矩阵所对应的位置相乘再相加,就获取了一个卷积之后的像素值。通过卷积之后,我们可以发现图片由原来的5*5变成了3*3,按照这种速度下去,我们经过几次卷积之后,图片的大小就变成了1*1,而有时候,对于非常负责的卷积神经网络来说,可能要做100次以上的卷积,这种方式显然是不可行的。所以,为了保证图片经过卷积之后,还能用于与卷积之前的图片大小保持一致,通过在输入图片的像素矩阵周围填充0。经过卷积之后图片大小的变化公式如下:

卷积神经网络

如上图的计算公式:(5-3+2*0)/1 + 1 = 3

3、池化层

池化层:池化层神经网络不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。通过池化操作可以将一张较高分辨率的图片转换成分辨率较低的图片,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。常用的池化层有,最大池化和平均池化,进行池化操作的时候,也需要一个定义核的大小,如核的大小是2*2,采用最大池化,也就是从像素矩阵中的4相邻像素中,选择一个最大的像素值,与卷积的移动操作相似。

4、全连接层

全连接层:在经过多轮的卷积层和池化层的处理之后,在卷积神经网络的最后一般会由1到2个全连接层来给出最后的分类结果。经过多轮的卷积层和池化层处理之后,可以认为已经将图像中的信息抽象成了信息含量更高的特征。其实,我们可以将卷积层和池化层看作是程序在自动提取图像特征的过程。在特征提取完成之后,还是需要使用全连接层来完成分类任务。

5、softmax层

softmax层:是进行多分类的,通过softmax层之后,可以得到当前样例属于不同种类的概率。

6、使用TensorFlow来实现卷积

TensorFlow提供了一个tf.nn.conv2d函数,可以很容易的计算一个卷积层的前向传播过程。

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,data_format=None, name=None)

input:输入的节点矩阵,注意这个举证是一个四维矩阵,第一维代表的是输入的batch,如训练手写数字的时候,需要设置每次训练图片的数量,后面三个维度代表输入数据的节点矩阵,如第一张图片input[0,:,:,:]。

filter:表示的是卷积层的权重,权重的类型必须与数据的类型一致。

strides:一个长度为4的数据,可以是列表或者张量,第一维和最后一维的数字要求一定是1,因为卷积层的步长只对矩阵的长和宽有效。

padding:是否填充,选项为"SAME"或"VALID",其中"SAME"表示添加全0填充,保证卷积前输入的矩阵和卷积后的输出矩阵大小一致,"VALID"表示不添加。

计算方式是,卷积核与图像像素矩阵所对应的位置相乘再相加,就获取了一个卷积之后的像素值。通过卷积之后,我们可以发现图片由原来的5*5变成了3*3,按照这种速度下去,我们经过几次卷积之后,图片的大小就变成了1*1,而有时候,对于非常负责的卷积神经网络来说,可能要做100次以上的卷积,这种方式显然是不可行的。所以,为了保证图片经过卷积之后,还能用于与卷积之前的图片大小保持一致,通过在输入图片的像素矩阵周围填充0。经过卷积之后图片大小的变化公式如下:

卷积神经网络

如上图的计算公式:(5-3+2*0)/1 + 1 = 3

3、池化层

池化层:池化层神经网络不会改变三维矩阵的深度,但是它可以缩小矩阵的大小。通过池化操作可以将一张较高分辨率的图片转换成分辨率较低的图片,可以进一步缩小最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。常用的池化层有,最大池化和平均池化,进行池化操作的时候,也需要一个定义核的大小,如核的大小是2*2,采用最大池化,也就是从像素矩阵中的4相邻像素中,选择一个最大的像素值,与卷积的移动操作相似。

4、全连接层

全连接层:在经过多轮的卷积层和池化层的处理之后,在卷积神经网络的最后一般会由1到2个全连接层来给出最后的分类结果。经过多轮的卷积层和池化层处理之后,可以认为已经将图像中的信息抽象成了信息含量更高的特征。其实,我们可以将卷积层和池化层看作是程序在自动提取图像特征的过程。在特征提取完成之后,还是需要使用全连接层来完成分类任务。

5、softmax层

softmax层:是进行多分类的,通过softmax层之后,可以得到当前样例属于不同种类的概率。

6、使用TensorFlow来实现卷积

TensorFlow提供了一个tf.nn.conv2d函数,可以很容易的计算一个卷积层的前向传播过程。

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,data_format=None, name=None)

input:输入的节点矩阵,注意这个举证是一个四维矩阵,第一维代表的是输入的batch,如训练手写数字的时候,需要设置每次训练图片的数量,后面三个维度代表输入数据的节点矩阵,如第一张图片input[0,:,:,:]。

filter:表示的是卷积层的权重,权重的类型必须与数据的类型一致。

strides:一个长度为4的数据,可以是列表或者张量,第一维和最后一维的数字要求一定是1,因为卷积层的步长只对矩阵的长和宽有效。

padding:是否填充,选项为"SAME"或"VALID",其中"SAME"表示添加全0填充,保证卷积前输入的矩阵和卷积后的输出矩阵大小一致,"VALID"表示不添加。