从此明白了卷积神经网络(CNN)

一、为什么要引入卷积神经网络?
前面我们学习了全连接网络:每个神经元与前后相邻层的每一个神经元都有连接关系,输入是特征,输出为预测的结果。
在这里插入图片描述
可以看到,一个28*28的黑白单通道图像,就要训练将近40万个参数,图像的分辨率一般很大的,RGB3通道,其参数将会更大。还有待优化的参数过多, 容易导致模型过拟合。 为避免这种现象 ,实际应用中一般 不会将原始图片直接喂入全连接网络 。在实际应用中,会先对原始图像进行特征提取,把提取到的特征喂给全连接
网络,再让全连接网络计算出分类评估值。这样,就引入了卷积神经网络,其实卷积神经网络就是将图像现预处理,将特征提取,再进行全连接层训练。
在这里插入图片描述
二、什么是卷积神经网络?
1.卷积 (Convolutional)卷积是一种有效提取图片特征的方法 。 一般用一个正方形卷积核,遍历图片上的每一个像素点。图片与卷积 核 重合区域内 ,相对应的每一个像素值 ,乘卷积核内相对应点的权重,然后求和, 再 加上偏置后,最后得到输出图片中的一个像素值。看一张图就明白了。
在这里插入图片描述
这里的运算是对应位置乘,而不是矩阵的乘法。
例 上面 是 5 x 5 x 1 的灰度图片, 1 表示单通道, 5 x 5 表示分辨率,共有 5 行 5
列个灰度值 。 若 用一个 3 x 3 x 1 的卷积核对 此 5 x 5 x 1 的灰度图片进行卷积 偏置项b=1,则,则求卷积求卷积的的计算计算是:是:((-1)x1+0x0+1x2+(1)x1+0x0+1x2+(-1)x5+0x4+1x2+(1)x5+0x4+1x2+(-1)x3+0x4+1x5+1=11)x3+0x4+1x5+1=1((注注意不要忘记加偏置1)。。

2.全零填充 Padding?
有时会在输入图片周围进行全零填充,这样可以保证输出图片的尺寸和输入
图片一致。
在这里插入图片描述
在 前面 5 x 5 x 1 的 图片周围进行全零填充, 可 使输出图片仍 保持 5 x 5 x 1 的
维度。 这个全零填充的过程叫做 padding 。输出数据体的尺寸=((W F+2P)/S+1)
W 输入数据体尺寸, F 卷积层中神经元感知域 ,S 步长 ,P 零填充的数量。
例: 输入是 7×7 ,滤波器是 3×3 ,步长为 1 ,填充为 0 ,那么就能得到一个 5×5
的输出。如果步长为 2 ,输出就是 3×3。
当然,padding不一定只有最外层只有一圈0,有可能有好几层,总之看你自己是否要求他保持形状不变。
在这里插入图片描述
使用padding 和不使用 padding 的输出维度
在这里插入图片描述
上一行公式是使用 padding 的输出图片边长,下一行公式是不使用 padding
的输出图片边长。 公式 如果不能整除,需要向上取整数。 如果用全零填充 也就
是 padding= SAME 。 如果不用全零填充 也就是 padding =VALID。zai
在tensorflow中,这样使用,conv2d是表示二维CNN。
在这里插入图片描述
之前写过一个例子,可以去看看。
3.对于多通道图片是如何处理的?
多数 情况下,输入的图片是 RGB 三个颜色组成的彩色图,输入的图片包含了
红 、 绿 、 蓝三层数据 卷积核的深度应该等于输入图片的通道数,所以使用 3 x 3 x 3的卷积核,最后一个 3 表示匹配输入图像的 3 个通道 这样这个卷积核有三层
每层会随机生成 9 个待优化的参数 一共 有 27 个待优化参数 w 和一个偏置 b 。
在这里插入图片描述
在这里插入图片描述
卷积计算方法和单层卷积核相似,卷积核为了匹配红绿蓝三个颜色 ,把三层
的卷积核套在三层的彩色图片上 重合的 27 个像素进行对应点的乘加运算,最
后的结果再加上偏置项 b ,求得 输出图片中的一个值。
这个 5 x 5 x 3 的输入图片加了全零填充 使用 3 x 3 x 3 的卷积核 所有 27 个点与
对应的待优化参数相乘 乘积求和再加上偏置 b 得到输出图片中的一个值 6 。
在这里插入图片描述
针对上 面 这幅彩色图片,用 conv2d 函数实现可以表示为:
一次输入 batch 张图片,输入图片的分辨率是 5 x 5 是 3 通道的 卷积核是
3 x 3 x 3 一共有 16 个卷积核,这样输出的深度就是 1 6 核滑动横向步长是 1 ,纵
向步长也是 1 p adding 选择 same 保证输出是 5 x 5 分辨率 。 由于一共用了 16
个卷积核,所以输出 图片 是 5 x 5 x 16 。图片大小没变化,深度还变大了,这不是与来越复杂吗?其实已经在提取了,接着往下看。
o
4.池化(pooling)
Tensorflow 给出了计算池化的函数。 最大池化用 tf.nn.max_pool 函数,平均
池化用 tf.nn.avg_pool 函数。最大池化就是比如2*2,就在4个格子里选最大的,平均池化就是在4个格子里求平均。对于图像而言,像素的大小其实就是颜色的深浅,所以,最大池化有利于图像线条的提取,而平均池化有利于背景的提取。
函数中要给出四个信息,对输入的描述、对池化核的描述、对池化核滑动步
长的描述和是否使用 padding 。
在这里插入图片描述
在这里插入图片描述
1 )对输入的描述 给出一次输入 batch 张图片 、 行列分辨率 、 输入通道的个
数 。
2 对池化核的描述: 只描述行分辨率和列分辨率 第一个和最后一个参数
固定是 1 。
3 )对池化核滑动步长的描述 只描述横向滑动步长和纵向滑动步长 第一
个和最后一个参数固定是 1 。
4 )是否使用 padding p adding 可以是使用零填充 SAME 或者不使用零填充
VALID

5.舍弃(dropout)
在这里插入图片描述
在神经网络训练过程中,为了减少过多参数常使用 dropout 的方法,将一部
分神经元按照一定概率从神经网络中舍弃。这种舍弃是临时性的,仅在训练时舍
弃 一些 神经元;在使用神经网络时,会把所有的神经元恢复到神经网络中。比如
上面 这张图 在训练时一些神经元不参加神经网络计算了。 D ropout 可以有效减
少过拟合。Tensorflow 提供 的 dropout 的函数 用 tf _nn _dropout 函数。 第一个参数链接上一层的输出,第二个参数给出神经元舍弃的概率 。
在实际应用中 常常在前向传播构建神经网络时使用 dropout 来减小过拟合
加快模型的训练速度 。dropout 一般会放到全连接网络中 。 如果在训练参数的过程中 输出tf_nn_dropout 上层输出 ,暂时 舍弃神经元的概率 这样就有指定概率的神经
元被随机置零,置零的神经元不 参加当前轮的参数优V化。
三、举个例子
L enet 神经网络结构为:
①输入为32321 的图片大小,为单通道的输入;
②进行卷积,卷积核大小为551 ,个数为 6 ,步长为 1 ,非全零填充模式
③将卷积结果通过非线性激活函数;
④进行池化,池化大小为22 ,步长为 1 ,全零填充模式
⑤进行卷积,卷积核大小为5
56 ,个数为 16 ,步长为 1 ,非全零填充模式
⑥将卷积结果通过非线性激活函数;
⑦进行池化,池化大小为2
2 ,步长为 1 ,全零填充模式
⑧全连接层进行10 分类。

在这里插入图片描述
对 Lenet 神经网络进行微调 ,使其适应 M nist 数据集
由于Mnist 数据集中图片大小为 28* 28 1 的灰度图片,而 Lenet 神经网络的输入
为 32321 ,故需要对 Lenet 神经网络进行微调。
①输入为28281 的图片大小,为单通道的输入;
②进行卷积,卷积核大小为551 ,个数为 32 ,步长为 1 ,全零填充模式
③将卷积结果通过非线性激活函数;
④进行池化,池化大小为22 ,步长为 2 ,全零填充模式
⑤进行卷积,卷积核大小为5
532 ,个数为 64 ,步长为 1 ,全零填充模式
⑥将卷积结果通过非线性激活函数;
⑦进行池化,池化大小为2
2 ,步长为 2 ,全零填充模式
⑧全连接层,10分类
在这里插入图片描述
这里,就将图像的特征提取出来了,后面就是使用全连接层,进行进一步训练,看着这个7764有同学会有疑惑,这不还是很大吗?其实你只要看7*7就好了,后面可以并行运算的。速度和参数都有很大进步。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页