【机器学习】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教授已经对该数据库进行了一定的说明,如下所示:

【机器学习】MATLAB读取mnist数据库_第1张图片

【机器学习】MATLAB读取mnist数据库_第2张图片

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

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

你可能感兴趣的:(机器学习,计算机视觉)