【机器学习】MATLAB读取mnist数据库

最近要做《优化理论基础》的课程大作业,需要用到mnist这个手写识别数据库,在网上查了一下如何使用,分享在这里,以飨读者。

mnist是纽约大学(NYU)Yann Lecun在上个世纪90年代做的一个关于手写数字识别的数据库。该数据库提出的Motivation是为了解决美国邮政zip code机器识别的问题。经过十几年的发展,目前手写数字识别的识别率已经高达99%+,真正地做到了商业化。

在Yann Lecun教授主页上有对mnist数据集的简单说明。首先明确一下,数据集中有哪几个文件。

  1. train-images-idx3-ubyte.gz: 训练数据集数据
  2. train-labels-idx1-ubyte.gz: 训练数据集标签
  3. t10k-images-idx3-ubyte.gz: 测试数据集数据
  4. t10k-labels-idx1-ubyte.gz: 测试数据集标签

注意到上述4个文件都是使用linux系统下gunzip打包好的.gz文件,同时,可能是由于网络上的原因吧,这几个文件虽然不大,但是笔者还是下载了一会儿的。为了方便后来者,笔者将解压好的文件放在了我的百度云盘上(http://pan.baidu.com/s/1cp1MJs),提供给大家下载。

下面说明如何使用mnist数据库:

本文参考了斯坦福大学Andrew Ng教授的课件,通过loadMNISTImages.m和loadMNISTLabels.m两个文件读取mnist数据集。

loadMNISTImages.m

function images = loadMNISTImages(filename)
%loadMNISTImages returns a 28x28x[number of MNIST images] matrix containing
%the raw MNIST images

fp = fopen(filename, 'rb');
assert(fp ~= -1, ['Could not open ', filename, '']);

magic = fread(fp, 1, 'int32', 0, 'ieee-be');
assert(magic == 2051, ['Bad magic number in ', filename, '']);

numImages = fread(fp, 1, 'int32', 0, 'ieee-be');
numRows = fread(fp, 1, 'int32', 0, 'ieee-be');
numCols = fread(fp, 1, 'int32', 0, 'ieee-be');

images = fread(fp, inf, 'unsigned char');
images = reshape(images, numCols, numRows, numImages);
images = permute(images,[2 1 3]);

fclose(fp);

% Reshape to #pixels x #examples
images = reshape(images, size(images, 1) * size(images, 2), size(images, 3));
% Convert to double and rescale to [0,1]
images = double(images) / 255;

end

loadMNISTLabels.m

function labels = loadMNISTLabels(filename)
%loadMNISTLabels returns a [number of MNIST images]x1 matrix containing
%the labels for the MNIST images

fp = fopen(filename, 'rb');
assert(fp ~= -1, ['Could not open ', filename, '']);

magic = fread(fp, 1, 'int32', 0, 'ieee-be');
assert(magic == 2049, ['Bad magic number in ', filename, '']);

numLabels = fread(fp, 1, 'int32', 0, 'ieee-be');

labels = fread(fp, inf, 'unsigned char');

assert(size(labels,1) == numLabels, 'Mismatch in label count');

fclose(fp);

end

可以看到,上述两个脚本的核心都是,先通过fopen得到文件句柄fid,在偏移得到魔数(magic)以及一些其他的信息,最终得到所有的数据,并将数据reshape到相应的维度(图片都是28x28大小的)。

在mnist数据库中,Lecun教授已经对该数据库进行了一定的说明,如下所示:

这里写图片描述

这里写图片描述

可见,我们的文件是一个binary的文件,在第一个偏移是魔数,我猜测作用应该是为了作校验。其中label是2049,而image是2051。之后的偏移量是图片数、行数、列数。之后就是pixel的值了。pixel的值是0~255的0。0(白色)作为背景、255(黑色)作为前景。

本文介绍了如何在MATLAB中使用,你学会了么?

  • 42
    点赞
  • 132
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
Matlab可以很好地处理MNIST数据集。MNIST数据集是一个手写数字图像数据集,常用于机器学习领域的图像分类任务。 首先,我们需要导入MNIST数据集。可以通过Matlab的文件读写函数来读取MNIST数据集的图像和标签。图像数据集包含60000个训练样本和10000个测试样本,每个样本为28x28像素的灰度图像。标签数据集包含相应图像的数字标签。 接下来,我们可以使用Matlab的图像处理工具箱来预处理数据。对于MNIST数据集来说,一般需要将图像像素归一化到0-1的范围内,并且可以进行一些增强操作,如旋转、缩放等。这些步骤可以提高数据的可用性和模型的准确性。 然后,我们可以使用Matlab机器学习工具箱来构建分类模型。可以选择适合的分类算法,如支持向量机、随机森林、K近邻等。还可以使用交叉验证和网格搜索等技术来选择最佳的模型超参数。 在模型训练完成后,我们可以使用Matlab的模型评估和预测功能来评估模型的准确性。可以计算模型的准确率、精确率、召回率等指标,进一步优化模型的性能。 最后,我们可以使用训练好的模型来预测新的手写数字图像。通过提取图像的特征并输入到模型中,可以得到相应的数字分类结果。 总的来说,Matlab提供了丰富的图像处理和机器学习功能,可以很方便地处理和分析MNIST数据集。通过使用Matlab的工具和函数,可以实现对MNIST数据集的预处理、建模和评估,从而实现对手写数字图像的分类任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值