《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络

附:课程链接

第七讲.卷积神经网络
7.1卷积神经网络

由于个人使用Win7系统,并未完全按照课程所讲,以下记录的也基本是我的结合课程做的Windows系统+PyCharm操作。且本人有python基础,故一些操作可能简略。并未完全按照网课。

记住编写代码时,除注释内容外,字符均使用英文格式。

一、回顾及展开

前两讲中我们利用全连接网络实现了对mnist数据集的训练,我们已学会使用数据集训练模型,并让训练好的模型输出识别的结果了。
全连接NN:每个神经元与前后相邻层的每一个神经元都有连接关系,输入是特征,输出为预测的结果。
在第五、六讲中,我们将原始图像的所有像素点以一维数组的形式(784个节点)输入全连接网络,全连接网络会计算分类评估值即识别出的结果。
在全连接网络中,每层参数w的个数=前一层神经元的个数*后一层神经元的个数,每层参数b的个数=后一层神经元的个数。这样,待优化的总参数:

在这里插入图片描述
以上节课中的两层NN为例:

《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第1张图片

通过计算可知,有共近40万个待优化的参数,这还只是一张分辨率为28*28的黑白图像。

如果换成生活中的高分辨率彩色图像,不仅像素点增加,还从灰度图的单通道信息,变成了红绿蓝的三通道信息。待优化的参数过多很容易导致模型过拟合。
为了避免此类现象发生,往往不会将原始图片直接喂入全连接网络,会先对原始图片进行特征提取,把提取到的特征喂给全连接网络,再让全连接网络安装前两节课的方法计算出分类评估值。

比如,下左图汽车图片,经过多次特征提取,再把提取后的计算机可以读懂的特征喂给全连接网络:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第2张图片

二、卷积

1、卷积便是一种有效提取图像特征的方法。
一般会用一个正方形的卷积核,遍历图片上的每一个点。图片与卷积核重合区域内,相对应的每一个像素值,乘以卷积核内相对应点的权重,求和,再加上偏置后,得到输出图片的一个像素值。

①比如:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第3张图片

一张5×5×1的灰度图片,1表示单通道,5×5表示分辨率,共有5行5列个灰度值。如果用一个3×3×1的卷积核对这个5×5×1的灰度图片进行卷积,偏置项b=1。

实际上就是让3×3×1的卷积核在5×5×1的灰度图片上滑动,让331的卷积核的平面中心(图中中间的点0)遍历5×5×1灰度图中的每一个像素点,遍历中3×3×1的卷积核每一次和5×5×1的灰度图实现9个像素点除核时对应位置的像素点乘以卷积核上相应位置的权重再把9个乘积求和,再加上偏置b,得到输出图片中的一个值。

则求卷积的计算是:卷积核上的-1乘以1,加上0乘以0,加上1乘以2,加上-1乘以5,加上0乘以4,加上1乘以2,加上-1乘以3,加上0乘以4,加上1乘以5,再加上偏置1,等于形成输出图片中的一个值1。
在这里插入图片描述

②这张动图(图片来源)展现了卷积核在输入图片中的滑动计算过程。
从输入图片的左上角开始滑动到输入图片的右下角结束,当滑动过后5×5×1的输入图片变为了3×3×1的输出图片。

《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第4张图片
输出图片边长 = (输入图片边长 - 卷积核长 + 1) / 步长
此图:(5 - 3 + 1) / 1 = 3。即输出图片是3×3的分辨率。由于用了1个卷积核,所以输出的深度是1,输出是3×3×1的图片。

三、全零填充Padding
有时候会在输入图片周围进行全零填充,这样可以保证输出图片的尺寸和输入图片一致。
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第5张图片
例,在前面5×5×1的图片周围进行全零填充,可使输出的图片仍然保持5×5×1的维度。这个全零填充的过程叫做padding

这个公式给出了使用padding与不使用padding的输出维度
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第6张图片
上一行公式是使用padding的输出图片边长,下一行是不适用padding的输出图片边长。公式如果不能整除,需要向上取整数。(例如2.4取作3)
在tensorflow框架中,用参数padding = 'SAME'表示全零填充,用padding = 'VALID'表示不全零填充。
比如刚刚5×5×1的灰度图,输入图片的长度是5,如果用全零填充,则输出图片的长 = 5/1 = 5,和输入图片的长相同:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第7张图片
如果不使用全零填充,则:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第8张图片
四、回归代码
1.tensorflow计算卷积的函数:

1、对单通道的图片求卷积
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第9张图片
函数中要给出四个信息:对输入图片的描述、对卷积核的描述、对卷积核滑动步长的描述、是否使用padding。

在输入描述中,①用batch给出一次喂入多少张图片②5,5表示每张图片分辨率大小,这里就是5行5列③这些图片包含了几个通道的信息,如果灰度图,则为单通道,1;如果彩色图,则为红、绿、蓝三通道,3。

在卷积核描述中,①3,3表示行列分辨率是3行3列②是1通道。卷积核的通道数是由输入图片的通道数决定的,卷积核的通道数等于输入图片的通道数,所以卷积核的通道数也是1③一共有16个卷积核,说明卷积操作后输出图片的深度是16,也就是输出为16通道。

在卷积核滑动步长描述中,第二个参数表示横向滑动步长,第三个参数表示纵向滑动步长。表示横向纵向都以1为步长。第一个1和最后一个1这里是固定的。

是否使用padding:这里用的是VALID,注意以字符串的形式给出。

2.对多通道的图片求卷积

多数情况下,输入的图片是RGB三个颜色组成的彩色图,输入的图片包含了红、绿、蓝三层信息,卷积核的深度应该等于输入图片的通道数,所以使用3×3×3的卷积核,最后一个3表示匹配输入图像的3个通道,这样这个卷积核有三层,每层会随机生成9个待优化的参数,一共有27个待优化参数w和一个偏置b。
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第10张图片
对于彩色图,按层分开,可以直观表示为上面这张图,三个颜色分量:红色分量、绿色分量、蓝色分量

卷积计算方法和单层卷积核相似,卷积核为了匹配红绿蓝三个颜色,也是三层的。把三层的卷积核套在三层的彩色图片上,重合的27个像素进行对应点的乘加运算,最后的结果再加上偏置项b,求得输出图片中的一个值。
这个5×5×3的输入图片加了全零填充,使用3×3×3的卷积核,所有27个点与对应的待优化参数相乘,乘积求和再加上偏置b得到输出图片的一个值6。

用conv2d函数实现
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第11张图片
一次输入batch张图片,输入图片的分辨率是5×5,是3通道的,卷积核是3×3×3,一共有16个卷积核,这样输出的深度就是16,核滑动横向步长是1,纵向步长也是1,padding选择same,保证输出是5×5分辨率。由于一共用了16个卷积核,所以输出图片是5×5×16。

2.池化:

通过卷积进行特征提取得到的特征,仍然数量巨大。通过池化,可以减少特征数量。
最大值池化可以提取图片纹理,均值池化可以保留背景特征。
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第12张图片
如果用2×2的核,对输入图片以2为步长进行池化,输出图片变为输入图片的1/4大小。最大值池化就是用2×2的核框住4个像素点(左图中绿色部分)选择最大的输出6;后,向右滑动到图中紫色部分,选出最大的8输出出来;滑动到图中蓝色部分,选出最大的3输出出来……直到遍历完整张图片。
均值池化与最大值池化过程相似,只不过提取的是4个像素点的均值,得到输出图片,提取到的结果是3.25、5.25、2、2。

tensorflow给出了计算池化的函数:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第13张图片
最大池化用tf.nn.max_pool函数,平均池化用tf.nn.avg_pool函数。

函数中也要给出四个信息:对输入的描述、对池化核的描述、对池化核滑动步长的描述、是否使用padding。

在输入描述中,给出一次输入batch张图片、行列分辨率、输入通道的个数。

在池化核描述中,只描述行列分辨率,第一个参数和最后一个参数固定是1。

在池化核滑动步长描述中,只描述横向滑动步长和纵向滑动步长,第一个参数和最后一个参数固定是1。

是否使用padding:可以使用零填充SAME或者不使用零填充VALID。

3.舍弃:

在神经网络训练中,为了减少过多的参数,常使用dropout的方法,将一部分神经元按照一定概率从神经网络中舍弃。这种舍弃是临时性的,仅在训练时舍弃一些神经元。在使用神经网络时,会把所有的神经元恢复到神经网络中。比如下图,在训练时一些神经元就不参加神经网络计算了:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第14张图片
dropout可以有效减少过拟合。

tensorflow提供了dropout函数:
在这里插入图片描述
tf.nn.dropout函数中,第一个参数表示上层输出,第二个参数表示神经元舍弃的概率。
在实际应用中,常常在前向传播构建神经网络时使用dropout来减小过拟合,加快模型的训练速度。

如果在训练参数的过程中,输出 = tf.nn.dropout(上层输出,暂时舍弃神经元的概率),这样有指定概率的神经元被随机置零,置零的神经元不参加当前轮的参数优化。

4.卷积NN:

其实,卷积NN就是借助卷积操作,对输入图片进行特征提取,再把提取到的特征喂入全连接网络。所以卷积神经网络可以认为是由两部分组成,一部分是对输入图片进行特征提取,另一部分就是全连接网络,只不过喂入全连接网络的不再是原始图片,而是经过若干次卷积、激活和池化后的特征信息:
《人工智能实践:Tensorflow笔记》听课笔记24_7.1卷积神经网络_第15张图片
卷积神经网络,从诞生到现在,已经出现了许多经典网络结构,比如Lenet-5、Alenet、VGGNet、GoogleNet、ResNet等,每一种网络结构都是以卷积、激活、池化、全连接这四种操作为基础进行拓展。
Lenet-5是最早出现的卷积神经网络,由Lecun团队首先提出,Lenet-5有效解决了手写数字的识别问题。接下来以Lenet-5为例介绍卷积神经网络的结构和用tensorflow编码实现。

你可能感兴趣的:(人工智能,人工智能)