机器学习入门:手写体识别与神经网络应用
约 1697 字大约 6 分钟
机器学习入门:手写体识别与神经网络应用
一、 手写体识别:机器学习的“Hello World”
1.1 MNIST数据集简介
- 性质:经典的入门级数据集。
- 内容:手写数字图片。
- 图片格式:28x28像素的灰度图。
- 灰度表示:每个像素用一个0-255的无符号整数表示亮度。
0:纯黑色。255:纯白色。- 中间值:不同深度的灰色。
- 数据规模:
- 训练集:60,000张图片。
- 测试集:10,000张图片。
1.2 问题的核心挑战
- 计算机生成的字符像素固定,易于规则判断。
- 手写字符存在差异(如笔画位置、粗细),没有确定性的判断规则,需要具有容错能力的系统。
二、 神经网络处理图像的基础方法
2.1 图像数据输入处理
- 问题:神经网络输入是多维向量(数组),而图像是二维像素矩阵。
- 解决方法:将二维图像**展平(Flatten)**为一维向量。
- 对于28x28的MNIST图片:按行依次拉出所有像素,形成一个784维的向量。
2.2 数据集划分与模型评估
- 训练集(Training Set):用于训练模型的数据。
- 测试集(Test Set):用于评估模型泛化能力的新数据。
- 核心评估标准:模型在测试集上的准确率更能反映其解决新问题的能力(泛化能力)。
2.3 机器学习中的常见现象
根据模型在训练集和测试集上的表现,可分为三种情况:
欠拟合(Underfitting)
- 表现:训练集和测试集的准确率都很低。
- 可能原因:模型过于简单,无法捕捉数据中的基本模式。
良好拟合(Good Fit)
- 表现:训练集和测试集的准确率都很高,且相差不大。
- 说明:模型具有良好的泛化能力。
过拟合(Overfitting)
- 表现:训练集准确率很高,但测试集准确率明显下降。
- 可能原因:模型过于复杂,过度拟合了训练数据中的噪声和细节,导致泛化能力差。
- 类比:学习中的“死记硬背”,而非理解原理。
- 解决方法:调整网络结构、使用L2正则化、Dropout等。
三、 全连接神经网络的局限与卷积神经网络的引入
3.1 全连接神经网络的瓶颈
- 在MNIST问题上,即使增加网络深度和神经元数量,并使用防过拟合技术,泛化能力的提升也很快达到瓶颈。
- 例如:2010年最好的六层全连接网络规模巨大,但提升已很困难,陷入“内卷”。
3.2 卷积神经网络的优势
- 效果对比:卷积神经网络在MNIST上取得了显著更好的效果。
- 1998年LeNet-5:测试集准确率达99.2%。
- 2012年模型:测试集准确率达99.77%。
- 核心思想:图像是二维结构,相邻像素间存在关联(如轮廓、纹理)。将图像强行展平为一维向量会破坏这些空间特征。
四、 卷积运算原理
4.1 什么是卷积?
- 操作对象:一个图像矩阵(如8x8)和一个小的卷积核(Kernel)/过滤器(Filter)(如3x3)。
- 操作过程:
- 将卷积核覆盖在输入图像的左上角。
- 将对应位置的元素相乘,然后将所有乘积相加,得到一个输出值。
- 将卷积核向右滑动一个位置(步长=1),重复步骤2。
- 到达最右端后,回到最左端并向下滑动一行,重复上述过程。
- 遍历整个输入图像,生成一个新的特征图(如6x6)。
4.2 卷积如何提取特征?
- 示例:垂直边缘检测
- 使用卷积核:
[[1, 0, -1], [1, 0, -1], [1, 0, -1]] - 原理:
- 在图像灰度均匀的区域,左右像素值相近,与卷积核正负值相乘后相互抵消,输出接近0(黑色)。
- 在垂直边缘处,左右像素值差异大,抵消作用弱,输出值较大(亮色),从而凸显了边缘。
- 使用卷积核:
- 水平边缘检测:可使用类似的水平方向卷积核(如
[[1, 1, 1], [0, 0, 0], [-1, -1, -1]])。 - 核心价值:通过设计不同的卷积核,可以自动提取图像中的低级特征(如边、角),这些特征是模型泛化能力的关键。
4.3 卷积相对于全连接的优势
- 保留空间信息:卷积操作在二维空间上进行,保持了像素间的局部关联。
- 参数共享:同一个卷积核遍历整个图像,大幅减少了参数数量。
- 平移不变性:同一个特征(如边缘)无论出现在图像哪个位置,都能被相同的卷积核检测到。
五、 使用Keras搭建全连接网络进行MNIST识别(实验要点)
5.1 数据处理
- 加载数据:使用
keras.datasets.mnist.load_data()获取(x_train, y_train), (x_test, y_test)。 - 形状转换:将图像数据从
(60000, 28, 28)展平为(60000, 784)。使用reshape函数。 - 归一化:将像素值从[0, 255]缩放到[0, 1]区间(除以255),有利于梯度下降。
- 标签编码:将标签
y从整数(0-9)转换为One-Hot编码(10维向量)。使用keras.utils.to_categorical。
5.2 网络结构调整
- 输入层:
input_dim设置为784。 - 输出层:
- 神经元数量设置为10(对应10个数字类别)。
- 激活函数使用Softmax,使10个输出值代表各类别的概率,且总和为1。
- 代价函数:对于多分类问题,使用交叉熵损失函数(
categorical_crossentropy)代替均方误差,通常效果更好。
5.3 训练与调优
- 扩大网络规模:增加隐藏层的神经元数量(例如每层256个)以提升模型容量。
- 调整批次大小:根据计算资源(GPU显存)设置合适的
batch_size以加速训练。 - 评估:训练完成后,使用
model.evaluate(x_test, y_test)在测试集上评估模型最终的损失和准确率。
总结
本节课以经典的MNIST手写体识别问题为引,阐述了全连接神经网络处理图像的基本方法及其局限性(破坏空间结构、易陷入性能瓶颈)。进而引入了卷积神经网络(CNN),重点讲解了卷积运算如何通过卷积核有效提取图像的空间特征(如边缘),这是CNN在图像任务上取得卓越泛化能力的关键。最后,通过Keras实验演示了使用全连接网络解决MNIST问题的完整流程,包括数据预处理、网络构建、调参技巧等,为后续深入学习卷积神经网络打下基础。
