目录
1、手写数字识别问题介绍
2、手写数字的可视化
3、多层感知机
4、scikit-learn实现手写数字识别
1、手写数字识别问题介绍
问题描述:手写数字识别是指给定一系列的手写数字图片以及对应的数字标签,构建模型进行学习,目标是对于一张新的手写数字图片能够自动识别出对应的数字。这里主要涉及到的技术是图像识别,图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。机器学习领域一般将此类识别问题转化为分类问题。手写数字识别可以转化为10分类问题,最终结果只能是0-9这10个数字。
网上手写数字数据集很多,大小也存在差异。这里使用Scikit-learn库中自带的手写数字数据集,其中包含1797个手写数字样本,每个样本是一张8*8的图片,用包含64个元素的一维数组表示,数组元素为0-16之间的整数,表示颜色信息。每个样本都有对应的标签,标签为0-9之间的整数。
2、手写数字的可视化
获取手写数字数据集并显示前36个样本图片的关键代码如下:
数据集中前36个样本显示效果如图所示。由于图片比较小,所以有些马赛克的效果。
3、多层感知机
多层感知机(人工神经网络)是指含有至少一个隐藏层的由全连接层组成的神经网络,其中每一个隐藏层的输出都会通过激活函数进行变换。多层感知机的层数、隐藏层的大小、激活函数都是超参数,可以自己设定。
- 参数:各个层之间的连接权重以及偏置;
- 目标:使得误差最小,是一个最优化问题;
- 方法:梯度下降法等;
- 过程:首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多)。这个过程涉及到代价函数、规则化、学习速率、梯度计算等。
为什么需要激活函数? 如果不用激活函数,无论神经网络有多少层,输出都是输入的线性组合,这样网络的逼近能力十分有限。引入非线性函数作为激励函数,这样深层神经网络表达能力更强,几乎可以逼近任意函数。
4、scikit-learn实现手写数字识别
MLPClassifier 默认隐藏层神经元为100个,激活函数为relu。改变这两个参数(hidden_layer_sizes 、activation),观察执行结果。