热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

手写字体识别--MNIST数据集

Matlab手写字体识别忙过这段时间后,对于上次读取的Matlab内部数据实现的识别,我回味了一番,觉得那个实在太小。所以打算把数据换成[MNIST数据集][1]。基础思想还是相同的

Matlab 手写字体识别

忙过这段时间后,对于上次读取的Matlab内部数据实现的识别,我回味了一番,觉得那个实在太小。所以打算把数据换成[MNIST数据集][1]。

基础思想还是相同的,使用TreeBagger(随机森林)的算法来训练样本,从而实现学习并且识别。这一次不会和上次那么草率了….同时分享一些关于TreeBagger的理解。

思想
和我上一个识别花是一样的。使用算法训练训练样本,得到一个模型model,从而使用predict函数根据模型对测试样本进行识别。从而达到手写字体识别的效果。这里我使用了Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun的建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。

这是->Mnist数据集官网<-上面有说明。

但是因为这个网站上的四个文件资源似乎不多,导致下载速度很慢,所以我把他们放在我的云盘里,给大家下载。云盘链接 密码:7awp
因为里面的内容全部是用二进制存的,所以我在的文件里也顺便把解压的.m的文件放进去了,也省得大家到处找。

代码实现

因为要导入的图片太多,一开始我使用imread时我发现,imread似乎是按照一个特定的文件名顺序读取文件的,所以对于我这些有顺序的图片,他不能按照顺序读。所以我自己想了个方法来读取60000张训练样本。

for i=1:60000
str = strcat('C:\Users\StevenT\Desktop\mnist数据集\train-images-idx3-ubyte\TrainImage_',num2str(i));
name = strcat(str,'.bmp');
name = char(name);
current_img = imread(name); %将当前图片赋值给一个变量
current_img = reshape(current_img,1,[]); %将矩阵变形
train_image(i,:) = current_img;
end

之后用同样的方法获得10000个测试样本。
对于测试标签和训练标签的读取,直接用textread来读取就可以了。

lable_test = textread('C:\Users\StevenT\Desktop\mnist数据集\t10k-labels-idx1-ubyte\test_lable.txt');

读取到样本和标签之后,对样本和标签进行训练。

model = TreeBagger(500,train_image,lable_train); %使用TreeBagger来对训练样本进行训练,获得一个model

result = predict(model,test_image); %之后使用model来对测试样本进行预测,将结果存在result

result = cell2mat(result); %因为result是cell类的,使用cell2mat转换成字符串

最后输出识别率

sc=double(result) - lable_test; 
count=sum(sc(:)==48)/100.0; %sc用来保存相减的结果,当其等于0(ASCII里是48)的时候就是识别正确的结果,最终得出识别率

整体代码

clear all;
clc;

%导入训练样本

for i=1:60000
str = strcat('C:\Users\StevenT\Desktop\mnist数据集\train-images-idx3-ubyte\TrainImage_',num2str(i));
name = strcat(str,'.bmp');
name = char(name);
current_img = imread(name);
current_img = reshape(current_img,1,[]); %将矩阵变形
train_image(i,:) = current_img;
end
train_image=double(train_image);

%导入测试样本

for i=1:10000
str = strcat('C:\Users\StevenT\Desktop\mnist数据集\t10k-images-idx3-ubyte\TestImage_',num2str(i));
name = strcat(str,'.bmp');
name = char(name);
current_img = imread(name);
current_img = reshape(current_img,1,[]); %将矩阵变形
test_image(i,:) = current_img;
end
test_image=double(test_image);

lable_test = textread('C:\Users\StevenT\Desktop\mnist数据集\t10k-labels-idx1-ubyte\test_lable.txt');
lable_train = textread('C:\Users\StevenT\Desktop\mnist数据集\train-labels-idx1-ubyte\train_lable.txt');
% lable_train = lable_train(1:100);
% lable_test = lable_test(1:100);

model = TreeBagger(500,train_image,lable_train); %使用TreeBagger来对训练样本进行训练,获得一个model

result = predict(model,test_image); %之后使用model来对测试样本进行预测,将结果存在result内

result = cell2mat(result); %因为result是cell类的,使用cell2mat转换成字符串

sc=double(result) - lable_test;
count=sum(sc(:)==48)/100.0; %sc用来保存相减的结果,当其等于0(ASCII里是48)的时候就是识别正确的结果,最终得出识别率

这里请大家把地址改成自己的地址。

这是运行后的工作区
工作区

count是识别的准确率,已经达到96.82%了
我的在TreeBagger里用了50棵决策树,同时我也尝试过500棵,讲真跑的很久,但是准确率却只提高了1%,所以我认识到这个决策树的个数是没很大影响的…(我的电脑跑的心好累)

这个例子中最重要的莫过于随机森林TreeBagger这个函数所以我在这里发一份博客,我觉得挺好懂的一份(好吧其实是因为有图)
http://www.36dsj.com/archives/21036

关于算法的问题吧,我觉得如果不是想搞算法开发的,还是会用就好:)

以上就是我做的一个小小的手写识别,后面我会把我的用GUI把自己手写的数字识别出来的小补充发出来。同时呢,正在学习SVM ,过段时间学的好的话,我会这个也发出来~~

大家共勉:)


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文介绍如何使用Python进行文本处理,包括分词和生成词云图。通过整合多个文本文件、去除停用词并生成词云图,展示文本数据的可视化分析方法。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入了解 Windows 窗体中的 SplitContainer 控件
    SplitContainer 控件是 Windows 窗体中的一种复合控件,由两个可调整大小的面板和一个可移动的拆分条组成。本文将详细介绍其功能、属性以及如何通过编程方式创建复杂的用户界面。 ... [详细]
author-avatar
手机用户2602897337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有