卷积神经网络(CNN)是一个多层的神经网络,每层由多个二维平面组成,其中每个平面由多个独立神经元组成。
1.卷积神经网络结构
(1)输入层:将每个像素代表一个特征节点输入到网络中
(2)卷积层:卷积运算的主要目的是使原信号特征增强,并降低噪音
(3)降采样层:降低网络训练参数及模型的过拟合程度。
(4)全连接层:对生成的特征进行加权
(5)softmax层:获得当前样例属于不同类别的概率
2.卷积神经网络结构与全连接神经网络的异同
卷积神经网络与全连接神经网络的输入层、全连接层、softmax层均相同,只是各层之间的连接方式不同
(a)卷积神经网络结构
(b)全连接神经网络结构
3.卷积
(1)求点积:将55输入矩阵中33深蓝色区域中每个元素分别与其对应位置的权值(红色数字)相乘,然后再相加,所得到的的值作为33输出矩阵(绿色)的第一个元素。
30+31+22+02+02+10+30+11+22=12
(2)滑动窗口:将33权值矩阵向右移动一个格(即,步长为1)
(3)重复操作:同样地,将此时深色区域内每个元素分别与对应的权值相乘然后再相加,所得到的值作为输出矩阵的第二个元素;重复上述“求点积-滑动窗口”操作,直至输出矩阵所有值被填满。
卷积核在2维输入数据上“滑动”,对当前输入部分的元素进行矩阵乘法,然后将结果汇为单个输出像素值,重复这个过程指导遍历整张图像,这个过程就叫做卷积。
这个权值矩阵(红色数字)就是卷积核
卷积操作后的图像称为特征图(feature map)
4.卷积是如何有效的减少参数的?
(1)局部连接
每个输出特征不用查看每个输入特征,而只需查看部分输入特征
(2)权值共享
卷积核在图像上滑动过程中保持不变
5.0填充(Padding)
观察卷积示例,我们会发现一个现象:在卷积核滑动的过程中图像的边缘会被裁剪掉,将55特征矩阵转换为33的特征矩阵
如何使得输出尺寸与输入保持一致呢?
0填充:用额外的“假”像素(通常值为0)填充边缘。这样,在滑动时的卷积核可以允许原始边缘像素位于卷积核的中心,同时延伸到边缘之外的假像素,从而产生与输入(55蓝色)相同大小的输出(5*5绿色)
6.多通道卷积
每个卷积核都会讲图像生成为另一幅特征映射图,即:一个卷积核提取一种特征。
为了使特征提取更充分,可以添加多个卷积核以提取不同的特征,也就是,多通道卷积.
7.池化(pooling)
- 计算图像一个区域上的某个特定特征的平均值或最大值,这种聚合操作就叫做池化(pooling)
- 卷积层的作用是探测上一层特征的局部连接,而池化的作用是在语义上把相似的特征合并起来,从而达到降维的目的。
- 这些概要统计特征不仅具有低得多的维度(相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。
- 常用的池化方法:
(1)均值池化:对池化区域内的像素点取均值,这种方法得到的特征数据对背景信息更敏感。
(2)最大池化:对池化区域内所有像素点取最大值,这种方法得到的特征对纹理特征信息更加敏感。
最大池化的例子:
8.步长
步长表示卷积核在图片上移动的格数
通过步长的变换,可以得到不同尺寸的卷积输出结果
当stride=1时
当stride=2时
卷积后图片的尺寸:
假设步长为S,原始图片尺寸为[N1,N1],卷积核大小为[N2,N2],那么卷积之后图像大小为:[(N1-N2)/S+1,(N1-N2)/S+1]
9.卷积神经网络过程概述
输入图像通过若干个“卷积—>降采样”后,连接成一个向量输入到传统的分类器层中,最终得到输出。
“卷积层+”表示一个或多个卷积层,一般最多有三个卷积层
“池化层?”表示可以有池化层也可以没有池化层
“全连接层+”表示一个或多个全连接层
10.TensorFlow中卷积神经网络的相关函数
(1)卷积函数
卷积函数定义在Tensorflow/python/ops下的nn_impl.py和nn_ops.py文件中: - tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)
- tf.nn.depthwise_conv2d(input,filter,strides,padding,name=None)
- tf.nn.separable_conv2d(input,depthwise_filter,pointwise_filter,strides,padding,name=None)
- 等等
常用的为tf.nn.conv2d(input,filter,strides,padding,use_cudnn_on_gpu=None,name=None)
input:需要做卷积的输入数据。注意:这是一个4维的张量([batch,in_height,in_width,in_channels]),batch指批处理大小,in_height,in_width表示数据的高和宽,in_channels表示通道数,要求类型为float32或float64其中之一。
filter:卷积核。[filter_height,filter_width,in_channels,out_channels],其中filter_height,filter_width表示卷积核的高和宽,in_channels,out_channels分别表示输入通道数和输出通道数
strides:图像每一维的步长,是一个一维向量,长度为4
padding:定义元素边框与元素内容之间的空间。“SAME”或“VALID”,这个值决定了不同的卷积方式。当为“SAME”时,表示边缘填充,适用于全尺寸操作;当为“VALID”时,表示边缘不填充。
use_cudnn_on_gpu:bool型,是否使用cudnn加速,一般默认
name:该操作的名称,一般默认
返回值:返回一个tensor,集feature map
使用示例:
(2)池化函数
池化函数定义在tensorflow/python/ops下的nn.py和gen_nn_ops.py文件中: - 最大池化:tf.nn.max_pool(value,ksize,strides,padding,name=None)
- 平均池化:tf.nn.avg_pool(value,ksize,strides,padding,name=None)
- 等等
value:需要池化的输入。一般池化层接在卷积层后面,所以输入通常是conv2d所输出的feature map,依然是4维的张量([batch,height,width,channels])
ksize:池化窗口的大小,由于一般不在batch和channel上做池化,所以ksize一般是[1,height,width,1]
strides:图像每一维的步长,是一个一维向量,长度为4
padding:和卷积函数中padding含义一样
name:该操作的名称
返回值:返回一个tensor
使用示例: