对于手写体的识别,我采用的是keras来实现的,首先搭建一个单层感知机的模型来训练,来观察其模型的预测效果。

学习步骤如下:

源码:

from keras.datasets import mnist
import matplotlib.pyplot as plt
import numpy as np
from keras.utils import np_utils
from keras.layers.core import Dense,Activation,Dropout  #从keras中导入layers模块,为搭建全连接层做好准备
from keras.models import Sequential  #从keras中导入sequential模块(X_train,Y_train),(X_test,Y_test)=mnist.load_data()
print(X_train.shape)
print(Y_train.shape)
print(X_test.shape)
print(Y_test.shape)
def plot_image(image):  #输入参数为imagefig=plt.gcf()  #获取当前图像fig.set_size_inches(2, 2)  #设置图片大小plt.imshow(image,cmap="binary")  #使用plt_imshow显示图片plt.show()#开始绘图
#plot_image(X_train[0])
X_test1=X_test   #备注未经处理的测试数据
Y_test1=Y_test #备注未经处理的测试标签
X_train=X_train.reshape(60000,784)#将28*28的二维数据转化成784的一维向量
X_test=X_test.reshape(10000,784) #将28*28的二维数据转化为784的一维向量
##转化成浮点型,该一维向量由784个0——255的浮点数组成,大部分为0,少部分有数字,数字大小代表图形每个点灰度深浅、
#接下来对一维向量的数字进行归一化,使每个数值范围都在0-1内
X_train=X_train.astype("float")
X_test=X_test.astype("float")
#print(X_train[0])
X_train=X_train/255
X_test=X_test/255
#print(X_train[0])#①接下来一步搞定图形数据的预处理
#X_train=X_train.reshape(60000,784).astype("float")/255
#X_test=X_test.reshape(10000,784).astype("float")/255#②标签数据的预处理
print(Y_train[:3])
#对数据进行一位有效编码
#编码位数为十位,对应分类的类别数目
N_classses=10
Y_train=np_utils.to_categorical(Y_train,N_classses)
Y_test=np_utils.to_categorical(Y_test,N_classses)
#print(Y_train[:3])#③搭建单层感知机网络
model=Sequential()
model.add(Dense(N_classses,input_dim=784))
model.add(Activation("softmax"))
model.summary()#④编译和训练,选择损失函数,优化算法,设置评估模型标准
model.compile(loss="categorical_crossentropy",#损失函数选择交叉熵函数optimizer ="adam",   #优化选择器adam或者sgdmetrics=["accuracy"]    #以准确率(accura)评估模型训练结果
)#⑤训练网络
N_epoch=20
Batch_size=128
Validation_split=0.2
training=model.fit(X_train,Y_train,   #输入训练集和标签batch_size=Batch_size,  #设置每次处理数据集的个数epochs=N_epoch,  #设置迭代次数validation_split=Validation_split,  #设置验证集的比率0.2verbose=2   #日志显示,0代表不在标准输入输出日志信息,1代表输出进度记录,2代表每次迭代输出一行记录且无进度条记录)#⑥训练好的网络进行测试集评估
Test =model.evaluate(X_test,Y_test,verbose=1)
print("测试误差:",Test[0])
print("准确度:",Test[1])#⑦预测
prediction=model.predict_classes(X_test)  #X_test已经进行编码处理了
def pre_result(i):plot_image(X_test1[i])print("Y_test:",Y_test1[i])print("预测结果:",prediction[i])
pre_result(0)

运行结果:

下面是多层感知机的手写体识别

该模型有一个输入层有784个神经元,两个隐藏层都有1000个神经元,一个输出层有10个神经元,使用了dropout()函数减少过拟合现象。

学习过程如上一样。

源码如下:

from keras.models import Sequential
from keras.datasets import mnist
from keras.layers.core import Dense,Dropout,Activation
import numpy as np
from keras.utils import np_utils
import matplotlib.pyplot as plt
(X_train,Y_train),(X_test,Y_test)=mnist.load_data()
def plot_image(image):fig=plt.gcf()fig.set_size_inches(2,2)plt.imshow(image,cmap="binary")plt.show()N_classses=10
X_test1=X_test
Y_test1=Y_test
X_train=X_train.reshape(60000,784).astype("float32")/255
X_test=X_test.reshape(10000,784).astype("float32")/255
Y_test=np_utils.to_categorical(Y_test,N_classses)
Y_train=np_utils.to_categorical(Y_train,N_classses)#print(Y_train[0])
model=Sequential()
model.add(Dense(1000,input_dim=784))  #输入层为784个神经元,输入层所连接的第一个隐藏层有1000个神经元
model.add(Activation("relu"))
model.add(Dropout(0.5))model.add(Dense(1000)) #第二个隐藏层
model.add(Activation("relu"))
model.add(Dropout(0.5))model.add(Dense(10))  #输出层有10个神经元,激活函数softmax
model.add(Activation("softmax"))model.summary()#网络编译
model.compile(loss="categorical_crossentropy",   #损失函数optimizer="adam",  #优化器选择adammetrics=["accuracy"]  #以准确率评估模型训练结果)
#网络训练
N_epochs=20
Batch_size = 128
Validation = 0.2
training =model.fit(X_test,Y_train,batch_size=Batch_size,epochs=N_epochs,validation_split=Validation,verbose=2
)#评估
Test =model.evaluate(X_test,Y_test,verbose=1)
print("误差:",Test[0])
print("准确率:",Test[1])#预测
prediction=model.predict_classes(X_test)  #预测所有的数据
def pre_result(i):plot_image(X_test1[i])print("Y_test:",Y_test1[i])print("预测值:",prediction[i])  #预测值
pre_result(0)
pre_result(1)

综上多层感知机的对于手写体识别预测不是很好,单层感知机对于手写体识别的预测较好。

基于感知机的手写体识别相关推荐

  1. 基于CNN的手写体识别与GUI系统设计(新手快进来!)

    目录 1. 写在前面 2. 环境搭建 3. 卷积神经网络 4. 数字手写体识别实现 1. 写在前面     这是我的本科毕设,今天终于差不多降完重了哈哈,总共耗时一个半月,写完赶紧趁热打铁来记录一下整 ...

  2. 【深度学习】基于Keras的手写体识别

    from keras import models from keras import layers from keras.datasets import mnist# 搭建网络 network = m ...

  3. 【FPGA】基于HLS的全连接神经网络手写体识别

    目录 一 系统分析 1.1 全连接神经网络简介 二 通过HLS 编写全连接神经网络传入权重参数和偏置参数文件 2.1  获得图片.权重以及偏置的参数 2.2 编写C语言的全连接算子 2.3 Slave ...

  4. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究

    基于matlab的手写体数字识别系统研究 丁禹鑫1,丁会2,张红娟2,杨彤彤1 [摘要]随着科学技术的发展,机器学习成为一大学科热门领域,是一门专门研究计算机怎样模拟或实现人类的学习行为的交叉学科.文 ...

  5. 基于matlab的手写体数字识别系统

    摘要:随着科学技术的发展,机器学习成为一大学科热门领域,是一门专门研究计算机怎样模拟或实现人类的学习行为的交叉学科.文章在matlab软件的基础上,利用BP神经网络算法完成手写体数字的识别. 机器学习 ...

  6. MNIST | 基于k-means和KNN的0-9数字手写体识别

    MNIST | 基于k-means和KNN的0-9数字手写体识别 1 背景说明 2 算法原理 3 代码实现 3.1 文件目录 3.2 核心代码 4 实验与结果分析 5 后记 概要: 本实验是在实验&q ...

  7. MNIST | 基于朴素贝叶斯分类器的0-9数字手写体识别

    MNIST | 基于朴素贝叶斯分类器的0-9数字手写体识别 1 背景说明 2 关于数据集 2.1 什么是MNIST 2.2 数据集处理 3 代码实现 3.1 文件目录 3.2 核心代码 3.3 注意点 ...

  8. 基于MATLAB的手写体数字识别算法的实现

    基于MATLAB的手写体数字识别 一.课题介绍 手写数字识别是模式识别领域的一个重要分支,它研究的核心问题是:如何利用计算机自动识别人手写在纸张上的阿拉伯数字.手写体数字识别问题,简而言之就是识别出1 ...

  9. 笔记:基于keras的不同神经网络模型Minst手写体识别

    基于keras的不同神经网络模型MNIST手写体识别 1.CNN版 1.导入数据 相关库(导入plt是为了看数据集的图) import keras from keras.datasets import ...

最新文章

  1. 三天没有更新我的BLOG
  2. 【收藏】firewalld开放端口
  3. MATLAB机器学习系列-11:粒子群优化原理及其matlab实现
  4. java修改hidden_Java ColumnConfig.setHidden方法代码示例
  5. android音乐播放器完整教程,android实现简单音乐播放器
  6. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)
  7. Android支付宝SDK开发笔记
  8. Redis系列教程(九):Redis的内存回收原理,及内存过期淘汰策略详解
  9. MEF: MSDN 杂志上的文章(15) 拒绝【多个导出,但只用一个导入,会拒绝,但还是稳定的组合】...
  10. fastText分类器
  11. 几何画板如何绘制动态正切函数图像
  12. 计算机基础---04ppt篇(world转化为ppt,字体设计,形状,ppt背景,音频,视频动画效果,模板推荐,插件推荐)
  13. java 电梯调度_OO_JAVA_多线程电梯调度_单元总结
  14. leetcode链表刷题 python
  15. Linux基础命令的那些事儿(1)
  16. 什么决定了你的职场天花板?
  17. [Flutter]微信分享并从分享链接跳回APP指定页面
  18. linux 下dump的使用
  19. c语言编写图形登录窗口,C语言实现图形界面登陆窗口
  20. Mat 的介绍和使用

热门文章

  1. boost::geometry::centroid用法的测试程序
  2. Boost.Flyweight 序列化示例
  3. boost::callable_traits的is_reference_member的测试程序
  4. ITK:二进制图像的近似距离图
  5. VTK:可视化之FrogBrain
  6. C++Binomia distribution二项分布的实现算法(附完整源码)
  7. C语言const关键字与指针
  8. 有序数组中查找数字的范围
  9. QT的QWriteLocker类的使用
  10. QT的QQmlPropertyMap类的使用