赵走x博客
网站访问量:151928
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:24、神经网络实例一一手写识别
资源编号:75922
人工智能
深入浅出Python机器学习
热度:114
在对MLP 有了大致的了解之后,我们让小C 开始动手解决女朋友小I 实际的问题。非常好的一点是,我们有一个现成的数据集可以使用,就是MNIST 数据集。在神经网络的学习中, 使用MNIST 数据集训练图像识别, 就如同程序员刚入门时要写的“ hello world ” 一样,是非常基础的必修课。
在对MLP 有了大致的了解之后,我们让小C 开始动手解决女朋友小I 实际的问题。非常好的一点是,我们有一个现成的数据集可以使用,就是MNIST 数据集。在神经网络的学习中, 使用MNIST 数据集训练图像识别, 就如同程序员刚入门时要写的“ hello world ” 一样,是非常基础的必修课。 # 1、使用MNIST 数据集 MNIST 数据集是一个专门用来训练各种图像处理系统的庞大数据集,它包含70000个手写数字图像,其中60000 个是训练数据,另外10000 个是测试数据。而在机器学习领域,该数据集也被广泛用于模型的训练和测试。MNIST 数据集实际上是从NIST 原始数据集中提取的,其训练集和测试集有一半是来自N IST 数据集的训练集,而另一半是来自NIS T 的测试集。 目前有大量的学术论文都在试图把模型对MNIST 数据集的识别错误率不断降低,目前识别错误率最低的一篇论文使用的是卷积神经网络,成功地把错误率降到了0.23% 。而最早创造这个数据集的学者,在他们最早的论文中使用了支持向量机算法,使模型识别的错误率达到了0.8% 。 接下来我们就用scikit - leam 的fetch mldata 来获取MNIST 数据集,输入代码如下: ``` # 导入数据集获取工具 from sklearn.datasets import fetch_mldata # 加载MNIST 手写数字数据集 mnist = fetch_mldata('MNIST original') print(mnist) ``` 运行结果: ``` {'DESCR': 'mldata.org dataset: mnist-original', 'COL_NAMES': ['label', 'data'], 'target': array([ 0., 0., 0., ..., 9., 9., 9.]), 'data': array([[0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], ..., [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0], [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)} ``` [结果分析] 从结果中看出, MNIST 数据集包含两个部分: 一个是数据的分类标签( label ) ; 另一个是数据本身( data )。Data 的类型是无符号的8 位整型np 数组,而target 是从0 到9 的整型数组。 接下来,我们检查一下数据集中的样本数量和样本特征数量。输入代码如下: ``` # 打印样本数量和样本特征数 print("样本数量:{},样本特征数{}".format(mnist.data.shape[0], mnist.data.shape[1])) ``` 运行结果: ``` 样本数量:70000,样本特征数784 ``` [结果分析]从结果中可以看到,数据集中有7 0000 个样本, 每个样本有784 个特征。这是因为, 数据集中存储的样本是2 8 × 28 像素的手写数字图片的像素信息, 因此特征数为28 × 28=784 个。在开始训练MLP 神经网络之前,我们还需要将数据进行一些预处理, 由于样本特征是从0 ~ 255 的灰度值,为了 让特征的数值更利于建模,我们把特征向量的值全部除以255 , 这样全部数值就会在0 和1之间, 再用我们非常熟悉的train_test_ split 函数将数据集分为训练集和测试集。现在输入代码如下: ``` # 导人数据集拆分工具 from sklearn.model_selection import train_test_split # 建立训练数据集和测试数据集 X = mnist.data / 255. y = mnist.target X_train, X_test, y_train, y_test = train_test_split( X, y, train_size=5000, test_size=1000, random_state=62) ``` 为了控制神经网络的训练时长,我们只选5000 个样本作为训练数据集,选取1000 个数据作为测试数据集。同时为了每次选取的数据保持一致, 我们指定ra ndom state 为 62 。读者朋友在实验的时候,可以自行增加训练数据集或测试数据集的样本量,也可以 调整random state 的数值, 看每次训练的结果会有什么变化。 # 2、训练MLP神经网络 在建立好训练数据集和测试数据集之后,我们开始训练神经网络, 输入代码如下: ``` from sklearn.neural_network import MLPClassifier # 设置神经网络有两个100 个节点的隐藏层 mlp_hw = MLPClassifier(solver='lbfgs', hidden_layer_sizes=[100, 100], activation='relu', alpha=1e-5, random_state=62) # 使用数据训练神经网络模型 mlp_hw.fit(X_train, y_train) # 打印模型分数 print('测试数据集得分:{:.2f}%'.format(mlp_hw.score(X_test, y_test) * 100)) ``` 这里,我们设置MLP 分类器的solver 参数为“ lbfgs ”,同时建立2 个隐藏层,每层有100 个节点。Activation 参数设置为“ relu ",正则项参数alpha 设置为le-5 也就是1 × $$10^{-5}$$ ,即0.00001 。设置好模型参数之后。 运行结果: ``` 测试数据集得分:93.60% ``` [结果分析] 从结果中可以看到,模型在测试集中的识别准确率达到了93.6% ,可以说是一个非常不锚的分数了。 # 3、使用模型进行数字识别 接下来看下模型在实际应用中表现如何,随便用一个图像测试一下,这里测试用的图片如图8-18 所示。  图8-1 8 用来测试模型识别准确率的图片 >因为图8-18 的图像是28 × 28 像素,所以放大后看起来会不够清晰。 下面把图8 -1 8 中的测试图像转化为模型可以读取的numpy 数组,输入代码如下: ``` # 打开图像 image = Image.open('4.jpg').convert('F') # 调整图像的大小 image = image.resize((28, 28)) arr = [] # 将图像中的像素作为预测数据点的特征 for i in range(28): for j in range(28): pixel = 1.0 - float(image.getpixel((j, i))) / 255. arr.append(pixel) # 由子只有一个样本, 所以需要进行reshape操作 arr1 = np.array(arr).reshape(1, -1) # 进行图像识别 print('图片中的数字是:{:.0f}'.format(mlp_hw.predict(arr1)[0])) ``` 在这一段代码中,我们调用了python 内置的图像处理库PIL,为了让识别的效果能够达到最优,我们首先使用了Image.convert 功能将图片转化为32 位浮点灰色图像,也就是说它的每个像素用32 个bit 来表示, 0 代表黑, 255 表示白。而后将每个像素的数值都进行除以255 的处理,以保持和数据集一致。 > 由于MNIST 数据集中是用0 代表白色, 而1 代表黑色, 因此我们还要用1 减去像素的灰度值, 以便和数据集一致。 此外由于只有一个样本,我们还要对其进行reshape(1,-1) 的操作。 运行结果: ``` 图片中的数字是:4 ``` 图8 -1 9 模型正确识别出了图像中的数字 [结果分析] 从结果中我们看到,神经网络正确地识别出了图片中的数字4 , 效果还是很不错的。当然了,这里使用的图像比较标准。感兴趣的读者朋友可以在纸上用笔手写几个数字,拍下照片再用神经网络进行识别, 看识别准确率究竟如何。 # 4、小结 在本章中,我们设定了一个场景一一让小C 训练一个神经网络帮助女朋友小I 进行数字图像的识别。借由这个场景,我们学习了神经网络的起源和发展历程,并初步理解了神经网络算法中多层感知机CMLP ) 的原理和参数设置, 最后我们使用了MNIST 数据集训练了一个数字识别的神经网络模型。当然,这个模型主要日的还是进行展示,要想真的实现替代人工完成票据凭证的录入,还需要做很多工作。 作为一种命运多舛的算法, 神经网络现在又以一种王者的姿态重回机器学习领域了。要说明一下的是, scikit-learn 中的MLP 分类和回归在易用性方面表现确实不错,但是仅限于处理小数据集。对于更庞大或更复杂的数据集来说,它就显得有点力不从心。所以如果读者朋友对深度学习有兴趣,可以更进一步了解现在非常流行的几个Pyt hon 深度学习库,如keras 、theano 和tensor-flow ,其中keras 可以使用tensor-flow 和theano 作为后端( backend )。这些深度学习库都支持使用GPU 加速,而scikit-leam 并不支持。所以在处理超大数据集的时候,以上提到的几个深度学习库都要比scikit-leam 效率更高。 如上所述,神经网络可以从超大数据集中获取信息并且可以建立极为复杂的模型,所以在计算能力充足并且参数设置合适的情况下,神经网络可以比其他的机器学习算法表现更加优异。但是它的问题也很突出,如模型训练的时间相对更长、对数据预处理的要求较高等。对于特征类型比较单一的数据集来说,神经网络的表现不错:但如果数据集中的特征类型差异比较大的话,随机森林或是梯度上升随机决策树等基于决策树的算法会表现更好。 另外,神经网络模型中的参数调节也是一门艺术,尤其是隐藏层的数量和隐藏层中节点的数量。对于初学者来说,建议参考这样一个原则,那就是神经网络中隐藏层的节点数约等于训练数据集的特征数量,但是一般不要超过500 。在开始训练模型的时候,可以让模型尽量复杂,然后再对正则化参数a lpha 进行调节来提高模型的表现。