matlab使用mnist数据读取字符,Matlab读取MNIST数据

mnist database(手写字符识别) 的数据集下载地:http://yann.lecun.com/exdb/mnist/。

准备数据

MNIST是在机器学习领域中的一个经典问题。该问题解决的是把28x28像素的灰度手写数字图片识别为相应的数字,其中数字的范围从0到9.

共有四个文件需要下载:

train-images-idx3-ubyte.gz,训练集,共 60,000 幅(28*28)的图像数据;

train-labels-idx1-ubyte.gz,训练集的标签信息(取值为 0-9),60,000*1

t10k-images-idx3-ubyte.gz,测试集(t: test, 10k: 10,000),共 10,000 副(28*28)的图像数据

t10k-labels-idx1-ubyte.gz,测试集的标签呢信息(取值为 0-9),10,000*1

更多详情, 请参考Chris Olah's visualizations of MNIST.

文件名中的 ubyte 表示数据类型,无符号的单字节类型,对应于 matlab 中的 uchar 数据类型。

注:在 Windows 平台下解压这些文件时,操作系统会自动修改这些文件的文件名,比如会将倒数第二个短线-修改为.,也即 train-images-idx3-ubyte.gz 解压为train-images.idx3-ubyte(文件类型就自作主张地变成了idx3-ubyte),注意文件的对应。

数据格式

2b15b7430528430f28ac7bdc740b1210.png

数据格数如图所示,即在真正的 label 数据或图像像素信息开始之前会有一些表头信息,对于 label 文件是 2 个 32位整型,对于 image 文件是 4 个 32位整型,所以我们需要对这两个文件分别移动文件指针,以指向正确的位置

由于matlab中fread函数默认读取8位二进制数,而原数据为32bit整型且数据为16进制或10进制,因此直接使用fread(f,4)或者fread(f,'uint32')读出数据均是错误数据,下面给出一种解决方案:通过将其转化为二进制,通过字符串拼接后再转化为十进制。

function [getdata]=readint32(FID)

data = [];

for i = 1:4

f=fread(FID,1);

data = strcat(data,num2str(dec2base(f,2,8)));

end

getdata = bin2dec(data);

end

数据读取与保存

image数据:

首先读取4个数据,分别是MagicNumber=2051,NumberofImages=6000,rows=28,colums=28,然后每读取rows×colums个数表示一张图片进行保存。

clear

clc

filename = './t10k-images-idx3-ubyte';

savename = './test_x';

FID = fopen(filename,'r');

MagicNumber=readint32(FID);

NumberofImages=readint32(FID);

rows=readint32(FID);

colums=readint32(FID);

savePath = [savename,'.mat'];

test_x = zeros(NumberofImages,rows*colums);

for i = 1:NumberofImages

temp = fread(FID,(rows*colums), 'uchar');

test_x(i,:) = temp';

end

save(savePath,'test_x')

label数据:

label数据读取与保存与image类似,区别在于只有MagicNumber=2049,NumberofImages=6000,然后每行读取的数据范围为0~9,因此令temp+1列为1,其余为0即可。

clear

clc

filename = './train-labels-idx1-ubyte';

savename = './train_y';

FID = fopen(filename,'r');

MagicNumber=readint32(FID);

NumberofImages=readint32(FID);

savePath = [savename,'.mat'];

train_y = zeros(NumberofImages,10);

for i = 1:NumberofImages

temp = fread(FID,1);

train_y(i,temp+1) = 1;

end

save(savePath,'train_y')

读者下载好数据后,将下列程序分别保存为m文件,只需更改程序里的filename,savename,变量名train_y/train_x/test_x/test_yh和保存save里的变量名即可

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值