1.导入MNIST数据集

直接使用fetch_mldata会报错,错误信息是python3.7把fetch_mldata方法移除了,所以需要单独下载数据集
从这个网站上下载数据集:

https://github.com/amplab/datascience-sp14/raw/master/lab7/mldata/mnist-original.mat

使用如下方法获取路径:

from sklearn.datasets.base import get_data_home
print (get_data_home()) # 如我的电脑上的目录为: C:\Users\Mr.Wmn\scikit_learn_data\mldata
#下载好mnist-original.mat数据集放到获取的路径里,在输入如下内容便不会报错了
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#导入数据集获取工具
from sklearn.datasets import fetch_mldata
#导入MLP神经网络
from sklearn.neural_network import MLPClassifier
#导入numpy
import numpy as np
#加载MNIST手写数字数据集
mnist = fetch_mldata('MNIST original')
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)}
print('\n\n\n')
print('代码运行结果')
print('====================================\n')
#打印样本数量和样本特征数
print('样本数量:{} 样本特征数:{}'.format(mnist.data.shape[0],mnist.data.shape[1]))
print('\n====================================')
print('\n\n\n')
代码运行结果
==================================== 样本数量:70000 样本特征数:784 ====================================
#建立训练数据集和测试数据集
X = mnist.data/255
y = mnist.target
X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=1000,random_state=62)
print(X_train,X_test,y_train,y_test)
[[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.]] [[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.]] [5. 7. 7. 0. 0. 4. 4. 5. 1. 2. 8. 7. 4. 8. 2. 3. 9. 7. 2. 5. 9. 7. 9. 6.
7. 1. 1. 3. 2. 6. 9. 4. 3. 1. 8. 3. 2. 0. 8. 0. 9. 7. 2. 9. 7. 9. 5. 1.
1. 0. 8. 2. 5. 6. 5. 2. 2. 8. 1. 6. 0. 5. 9. 9. 6. 5. 4. 3. 1. 7. 5. 9.
2. 4. 2. 3. 2. 2. 8. 1. 8. 9. 1. 3. 3. 4. 7. 7. 9. 8. 5. 0. 3. 0. 1. 0.
7. 5. 8. 2. 5. 8. 3. 7. 0. 1. 9. 4. 6. 7. 0. 7. 4. 0. 6. 0. 3. 4. 0. 6.
9. 0. 6. 1. 7. 0. 3. 9. 7. 3. 8. 0. 8. 8. 5. 6. 1. 2. 3. 9. 1. 9. 2. 1.
3. 4. 9. 1. 0. 8. 6. 3. 1. 8. 5. 0. 2. 0. 6. 5. 6. 3. 1. 3. 1. 1. 1. 5.
6. 1. 9. 2. 8. 5. 7. 8. 5. 9. 1. 2. 8. 1. 0. 9. 4. 2. 4. 2. 1. 8. 8. 8.
1. 2. 9. 7. 8. 4. 1. 6. 8. 6. 7. 8. 7. 2. 5. 2. 5. 8. 1. 4. 3. 0. 6. 3.
5. 8. 6. 9. 4. 9. 1. 6. 6. 6. 3. 0. 9. 2. 4. 2. 2. 4. 3. 9. 2. 5. 8. 4.
1. 0. 8. 1. 8. 5. 3. 1. 8. 7. 7. 9. 6. 9. 3. 7. 8. 9. 1. 1. 5. 8. 7. 7.
0. 0. 5. 7. 6. 2. 5. 4. 4. 4. 3. 0. 5. 0. 8. 1. 8. 5. 2. 6. 2. 9. 9. 2.
8. 3. 8. 0. 9. 4. 8. 5. 7. 7. 0. 1. 7. 2. 4. 2. 5. 3. 7. 0. 4. 4. 9. 1.
9. 0. 4. 3. 7. 4. 5. 8. 0. 8. 1. 2. 9. 2. 1. 3. 3. 0. 5. 3. 2. 8. 7. 6.
6. 6. 4. 3. 1. 8. 4. 0. 3. 9. 2. 1. 7. 0. 5. 2. 5. 4. 3. 5. 6. 9. 4. 7.
4. 4. 2. 4. 1. 1. 3. 1. 3. 8. 5. 7. 5. 0. 1. 8. 2. 8. 2. 2. 8. 7. 1. 6.
7. 7. 1. 7. 4. 0. 5. 1. 8. 5. 1. 9. 5. 6. 8. 6. 1. 7. 9. 0. 9. 2. 3. 6.
2. 4. 8. 2. 6. 8. 1. 9. 5. 0. 7. 5. 8. 2. 0. 5. 4. 3. 1. 8. 8. 7. 8. 9.
6. 6. 0. 9. 3. 9. 8. 9. 0. 5. 0. 6. 0. 1. 9. 3. 0. 3. 9. 8. 0. 6. 5. 3.
4. 8. 5. 3. 9. 5. 8. 4. 3. 7. 1. 4. 8. 9. 6. 4. 9. 1. 0. 3. 2. 8. 4. 1.
4. 9. 7. 5. 8. 2. 6. 0. 2. 8. 1. 2. 6. 6. 0. 8. 4. 7. 5. 7. 8. 9. 0. 0.
9. 2. 6. 4. 0. 3. 6. 9. 1. 1. 1. 9. 8. 4. 1. 6. 5. 4. 1. 3. 0. 0. 4. 7.
7. 3. 5. 3. 6. 0. 1. 9. 6. 3. 2. 2. 5. 9. 2. 7. 5. 1. 0. 1. 3. 9. 0. 4.
3. 6. 7. 5. 7. 5. 9. 3. 3. 4. 8. 1. 8. 0. 1. 2. 9. 8. 3. 6. 3. 0. 7. 1.
3. 2. 2. 9. 7. 8. 0. 6. 5. 6. 1. 5. 3. 4. 5. 1. 9. 4. 9. 6. 6. 7. 4. 2.
4. 5. 8. 9. 1. 9. 6. 7. 7. 0. 0. 6. 9. 0. 6. 0. 5. 2. 8. 9. 8. 1. 4. 3.
0. 6. 5. 4. 6. 9. 7. 1. 9. 0. 5. 4. 7. 6. 0. 5. 0. 3. 0. 0. 0. 1. 4. 0.
7. 5. 0. 9. 5. 3. 4. 9. 9. 7. 6. 0. 6. 1. 3. 5. 7. 5. 2. 9. 6. 0. 5. 7.
8. 5. 0. 9. 2. 8. 1. 7. 0. 8. 7. 7. 7. 7. 5. 5. 5. 7. 2. 1. 9. 9. 7. 2.
9. 4. 0. 4. 8. 3. 3. 4. 9. 3. 7. 0. 2. 9. 8. 8. 7. 5. 8. 7. 9. 0. 6. 9.
8. 6. 1. 7. 2. 8. 9. 8. 2. 4. 7. 1. 8. 8. 7. 3. 1. 8. 8. 9. 7. 4. 7. 7.
1. 1. 8. 8. 2. 7. 1. 7. 6. 3. 7. 6. 5. 2. 3. 7. 2. 0. 7. 3. 9. 8. 0. 0.
5. 4. 4. 2. 9. 9. 5. 8. 4. 7. 4. 8. 5. 8. 3. 1. 7. 4. 8. 9. 2. 3. 8. 7.
3. 2. 7. 2. 6. 7. 7. 9. 1. 0. 8. 6. 6. 9. 4. 7. 9. 3. 1. 4. 6. 0. 8. 6.
5. 1. 8. 2. 1. 5. 3. 7. 1. 2. 5. 4. 6. 2. 6. 3. 2. 1. 7. 6. 8. 6. 3. 8.
3. 9. 0. 4. 2. 2. 8. 8. 3. 7. 8. 4. 3. 5. 3. 2. 2. 8. 0. 1. 0. 9. 4. 3.
6. 1. 6. 1. 2. 3. 3. 4. 0. 0. 7. 2. 6. 0. 3. 7. 2. 6. 4. 6. 6. 3. 9. 5.
6. 5. 8. 1. 3. 7. 8. 8. 9. 0. 1. 9. 3. 4. 1. 4. 1. 1. 7. 4. 8. 5. 8. 1.
3. 6. 3. 8. 5. 9. 0. 6. 4. 8. 0. 3. 3. 9. 1. 0. 4. 1. 3. 4. 6. 4. 9. 2.
8. 4. 0. 5. 3. 9. 7. 0. 9. 7. 8. 6. 7. 7. 6. 8. 9. 5. 1. 1. 7. 4. 5. 9.
8. 5. 1. 1. 7. 3. 1. 9. 9. 9. 3. 8. 2. 9. 7. 1. 7. 1. 1. 4. 3. 1. 1. 3.
0. 1. 3. 3. 4. 5. 8. 1. 2. 0. 4. 6. 7. 1. 2. 1.] [8. 2. 5. ... 3. 6. 9.]

2.训练MLP神经网络

#设置神经网络有两个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('\n\n\n')
print('代码运行结果')
print('====================================\n')
#打印模型分数
print('测试数据集得分:{:.2f}% '.format(mlp_hw.score(X_test,y_test)*100))
print('\n====================================')
print('\n\n\n')
代码运行结果
==================================== 测试数据集得分:85.79% ====================================

3.使用模型进行数字识别

#导入图像处理工具
from PIL import Image
#打开图像
image = Image.open("4.png").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]))
图片中的数字是:5

总结 :

  scikit-learn中的MLP分类和回归在易用性表现不错,但是仅限于处理小数据集,对于更庞大或更复杂的数据集就不怎么友好了.

  在计算能力充足并且参数设置合适的情况下,神经网络可以比其他的机器学习算法表现更加优异

  其缺点也很明显,如模型训练时间相对更长,对数据预处理的要求较高.

文章引自 : 《深入浅出python机器学习》

MLP神经网络实例--手写识别的更多相关文章

  1. BP神经网络的手写数字识别

    BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...

  2. TensorFlow MNIST(手写识别 softmax)实例运行

    TensorFlow MNIST(手写识别 softmax)实例运行 首先要有编译环境,并且已经正确的编译安装,关于环境配置参考:http://www.cnblogs.com/dyufei/p/802 ...

  3. [纯C#实现]基于BP神经网络的中文手写识别算法

    效果展示 这不是OCR,有些人可能会觉得这东西会和OCR一样,直接进行整个字的识别就行,然而并不是. OCR是2维像素矩阵的像素数据.而手写识别不一样,手写可以把用户写字的笔画时间顺序,抽象成一个维度 ...

  4. TensorFlow卷积神经网络实现手写数字识别以及可视化

    边学习边笔记 https://www.cnblogs.com/felixwang2/p/9190602.html # https://www.cnblogs.com/felixwang2/p/9190 ...

  5. 利用c++编写bp神经网络实现手写数字识别详解

    利用c++编写bp神经网络实现手写数字识别 写在前面 从大一入学开始,本菜菜就一直想学习一下神经网络算法,但由于时间和资源所限,一直未展开比较透彻的学习.大二下人工智能课的修习,给了我一个学习的契机. ...

  6. 使用tensorflow实现mnist手写识别(单层神经网络实现)

    import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import n ...

  7. kNN算法实例(约会对象喜好预测和手写识别)

    import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...

  8. tensorflow笔记(四)之MNIST手写识别系列一

    tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

  9. Tensorflow之基于MNIST手写识别的入门介绍

    Tensorflow是当下AI热潮下,最为受欢迎的开源框架.无论是从Github上的fork数量还是star数量,还是从支持的语音,开发资料,社区活跃度等多方面,他当之为superstar. 在前面介 ...

随机推荐

  1. linux 中 scp 命令

    scp命令用于Linux 之间复制文件和目录.如果想在windows 环境中使用需要安装 linux 命令环境,比如 cmder scp是 secure copy的缩写, scp是linux系统下基于 ...

  2. PHP判断文件大小是MB、GB、TB...

    <?php date_default_timezone_set ("PRC" ); function getFilePro($fileName){ if (!file_exi ...

  3. LDFLAGS 与 LDLIBS

    今天下载了开源程序“贪吃蛇” (github地址 : https://github.com/taylorconor/tinytetris.git) 在编译时,出现如下错 linux:~/code/ot ...

  4. java 时间的原生操作和工具类操作

    package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...

  5. 无法嵌入互操作类型"NationalInstruments.TestStand.Interop.UI.ExecutionViewOptions"。请改用适用的接口

    参考一下文章说明, 修改Interop.UI动态库的引入属性为 False,不再报错:   VS2010,VS2012,VS2013中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法 在VS2 ...

  6. ThreadLocal Memory Leak in Java web application - Tomcat

    ThreadLocal variables are infamous for creating memory leaks. A memory leak in Java is amount of mem ...

  7. GNU C之__attribute__

    __attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute_ ...

  8. JS和vue文本框输入改变p标签的内容测试

    文本框输入,p标签的内容自动变成文本框的内容,如下是三种方法的测试: 方法1:JS里的onchange,当文本框内容改变事件,该事件里写的方法是,获取p标签本身,然后获取文本框的值,赋值给变量,最后给 ...

  9. 【原生JS插件】LoadingBar页面顶部加载进度条

    先展示一下已经实现的效果: 预览地址:http://dtdxrk.github.io/js-plug/LoadingBar/index.html 看到手机上的浏览器内置了页面的加载进度条,想用在pc上 ...

  10. 【C# 开发技巧】 c#窗体关于调试界面和运行界面不一样的原因之一

    如下图所示: 原因是因为主窗体属性AutoScaleMode设置为:Font了: 按自己需求将AutoScaleMode设置修改即可. 另外一个可能是系统显示-缩放与布局-要调整到100% 如下图: