卷积神经网CNN(1)

感谢李宏毅老师
参考《TensorFlow 学习指南》和《TensorFlow 深度学习》
参考网上视频

卷积神经网络(CNN)
现在在图像识别上我们都会采用 CNN ,卷积神经网络针对图像识别中出现问题给出了解决方案。那么这些问题都是什么?第一个问题就是参数过多。
参数过多
我们在之前设计神经网络中已经接触识别图分类,如果是一个图像,我们将每一个像素看做一个特征,假设图像像素为 1000 * 1000 就会有 10^6 特征值,我们将特征值输入到神经层中,因为是全连接,假设神经层有 10^6 神经元那么参数就是 10^12 ,这样一来普通计算机是无法承载这么大计算量。
参数过多带来的问题如下
过拟合

什么是过拟合呢?我们从图中最右侧是过拟合,我们从图中可以看出这条弯弯曲曲的线性方程因为参数足够多,方程很好拟合训练集,但是线性方法无法正确反映数据集的规则。所以对于测试集表示就不好。因为参数足够多就会记住每一个样本,虽然精确记住样本。
化简参数可能性
专注特征值
在对图片进行识别过程就是找图片是否存在一些特征(pattern),如果存在我们就得出结论,通常情况这些 特征(pattern)会小于图片。
我们设计一些神经元负责搜索图中是否有鸟嘴、翅膀和鸟抓存在,来判断这张图是否有鸟存在。

有的时候通过搜索中图片特征值(pattern)来判断是否有小鸟。神经元负责查找搜索小鸟嘴。

特征可移动(权重共享)
这样同样特征(pattern) 可能出现图中不同位置,不过他们代表同样意义。我们没有必要设计出两个神经元来负责搜索左上角鸟嘴和图中间的鸟嘴。这就是说明特征(pattern)与位置无关。


缩小图片(池化层)
有的时候即使我们将图片缩小也不会丢失某些特征值,在不丢失特征值前提下我们可以将图片调小从而减少参数的数量。

在现在 CNN 会在进入 CNN 架构前会通过 Scalar 对图片进行处理,将一些位置图进行旋转缩放操作然后在进入 CNN 架构。

CNN 架构
- 卷积层(卷积核和权重共享)
- 池化层
这两卷积层和池化层可以反复多次,具体重复次数根据实际情况决定。然后就是对模型进行 flatten 处理也就是把多维数组压缩为一维数组作为下一层输入 ,最后还需要进行全连接就可以得到结果,这里全连接层与之前的神经网的全连接层没有任何区别。

在卷积神经网络中通常会有多个卷积核( Filter ),每一个 Filter(也就是搜索特征值pattern)中参数也是通过学习得到了。

我们卷积核是 3 x 3 矩阵,然后在图片矩阵的左上角开始做矩阵内积得到 3


然后卷积核(Filter)会向移动 stride 长度,这个长度是根据实际情况而定,

根据 stride = 1 长度我们卷积核在图上进行游走,最后得到 4 x 4 的矩阵,这样好处就是现在隐藏层神经元不必和全部的输入相连接。


图中可以所搜到两处符合特征(pattern)

完成第一个卷积核(Filter)我们可以开始第二个卷积核,方法和定义卷积核相同。



通过多个卷积核后我们会形成 Feature Map 每一个卷积核对应一层,卷积核数量越多卷积核深度也就越大。

对于多通道分别进行特征处理,对于 3 通道的图片响应卷积核可以是 3 通道的,那么我们想象以问题就是一个卷积核 3 * 3 的具有 192 特征的神经网层会有多少参数,计算下 (33)3 * 192 这就是一共参数数量。
