大家好,我是一名机器学习爱好者,写这篇文章主要用于记录自己的学习过程。
如何识别数字
卷积网络神经通过卷积层从图片中提取出特征值,然后经过池化层强化强化特征,最后交给全连接神经网络计算出数字。
输入层
俗称巧妇难为无米之炊,没有数据我们也没法进行训练。我们使用MNIST数据集,可以从这个链接下载 yann.lecun.com/exdb/mnist/ 。
计算机看到的图片与我们是不一样的,我们需要将图片转化为灰度图。针对 MNIST 手写数字识别,它本身就是灰度图(28×28,像素值 0–255)
也可以做一次归一化,把像素值从 [0, 255] 映射到 [0, 1],
这是归一化公式:
有时也会在原始图像周围填充一圈0,如下图:
这么做有两个作用:
- 保持输出尺寸不变
- 例如:输入图像大小:
5×5,卷积核:3×3,步长 stride = 1,不填充时:输出大小 =5 - 3 + 1 = 3→3×3。但如果我们在图像四周各填充一圈 0(padding=1):输出大小 =(5 + 2*1) - 3 + 1 = 5→5×5
- 保留边缘信息
-
不填充时,边缘像素被利用得更少:
- 图像中间的像素会出现在很多个卷积窗口里。
- 边缘和角落的像素,只会出现在少数几个窗口里,信息贡献小。
-
填充以后,边缘像素也能像中心像素一样,多次进入卷积计算,从而让网络学习到更完整的特征
卷积层
卷积层的作用:提取图片中每个小部分的特征值
首先我们需要定义一个卷积核(小窗口权重矩阵),卷积核会在图像上滑动,提取图片的特征值。比如一个卷积核专门用于识别“竖线”,另一个卷积核专门用于识别“横线”。当“竖线”的卷积核滑动到图片中的竖线时,就会产生较大的值,反之产生较小的值。
假设我们输入的是5x5x1的图像,定义一个3x3x1的卷积核(红色),右边就是卷积核运算结果(绿色)
卷积核工作演示:
感受野
感受野就是卷积层输出的每个像素点在原始图像上的映射区域大小。每个卷积核每次滑动只处理图像的一部分区域(局部连接),这块区域就是该神经元的 感受野。
大的感受野能识别到图片整体的轮廓(数字的整体形状),小的感受野能识别到局部特征(边缘,角点)。
池化层
池化层是卷积神经网络(CNN)里的一种 下采样层,它的核心作用是:
- 缩小特征图的尺寸(降低计算量)
- 保留主要特征,去除冗余信息
- 增强模型的平移不变性(数字稍微移动位置也能识别出来)
池化层算法主要有两种:
- 最大池化 取池化窗口里的最大值。
- 直觉:保留最显著的特征(边缘、亮点)。
- 例如:窗口
[1, 3, 2, 0] → 3
- 平均池化 取窗口的平均值。
- 直觉:平滑数据,保留整体趋势。
- 例如:窗口
[1, 3, 2, 0] → 1.5
一般常用最大池化。
示例
假设输入是4x4的图像,池化核是2x2,步长为2
输入:
1 3 2 4
5 6 7 8
2 4 6 8
3 5 7 9
输出:
6 8
5 9
经过池化之后,图像缩减成原来的1/4,保存了最大特征值的同时也减少了后续的计算量。
最后将矩阵展开成一维向量交给神经网络学习,神经网络不在这里过多赘述。
如何更新卷积层
最开始学习得时候对卷积核参数设置也是一脸懵逼,很多文章也没有提到过,直到看到下面这个图才明白是如何更新卷积核的。
卷积核中的参数就相当于神经网络中神经元的权重,当神经网络进行梯度下降和反向传播的时候就会更新卷积核中的参数。