MNIST数据集介绍
MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据。
训练集中包含60000个样本,测试集中包含10000个样本。
MNIST数据集的官方网站
解压后共有4个文件:
文件名 | 内容 |
---|---|
t10k-images | 10000张测试图片(1 611kb) |
t10k-labels | 测试集图片对应的标签(29kb) |
train-images | 55000张训练集图片和5000张验证集图片(9 681 kb) |
train-labels | 训练集图片对应的标签(5kb) |
idx3的数字表示数据维度。也就是图像为3维,标签维1维。
图像的3个维度分别为:训练集图像28pix28pix60000张 测试机 28pix28pix10000张。
官网上的MNIST训练集标签:
首先,offset是偏置,实际上就是一个标号,记录这个字段起始位置在这串数据的第几个字节。拿第一行举例子,从0000的位置开始,(这个0000是16进制,每个16进制位表示是4bit),从0000开始到0003结束,实际上是4字节 = 32bit,所以可以看到这个offset字段的数据类型type是32位整数。这个字段数据为0000 0801 用十进制来说就是2049。
训练集图片数据
每一个无符号数表示一个像素,根据description看出,图像大小为2828。往后每2828个像素为一幅图像,直接读取出来是一行数据,之后可以再恢复成方形矩阵。
读取MNIST数据
将MNIST数据转化成jpg格式程序
matlab程序main.m
clear
clc
%% 首先将ubyte格式文件转化成常用的.mat文件格式
filename = ‘./train-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,rowscolums);
for i = 1:NumberofImages
temp = fread(FID,(rowscolums), ‘uchar’);
test_x(i,:) = temp’;
end
save(savePath,‘test_x’)
%%将.mat文件转化为jpg格式
for j = 1:1:NumberofImages
b = test_x(j,:); %每次读取一行数据
D = reshape(b,128,128);
sc=strcat(‘E:\based_deeplearning_image_classification\chengxu\data_2_mnist\result\train-images-idx3-ubyte’,sprintf(’%d’,j)); %命名保存
Sc=strcat(sc,’.jpg’);
imwrite(D,Sc);
end
readint32.m
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
用自己的图片数据生成idx3-ubyte格式的数据集
在程序中,我把每一步的输出都打印出来,以便说明每一步的作用。
首先定义一个二维数组Names,分别用来存放输入,输出的路径和标签。这里输入的是相对路径。
前期准备,将自己的数据集每一类存放在各自的文件夹中,文件夹分别以1, 2, 3, 4…命名,全部放在./training-images目录下。
接着看每一段程序的功能。
Names = [['./training-images','train'], ['./test-images','test']]
for name in Names:
data_image = array('B')
data_label = array('B')
FileList = []
遍历Names中的元素, 并定义存放图片信息的序列data_image和存放标签信息的序列data_label。再定义一个空的数组FileList。
用循环逐层遍历,直到读取.png格式的图片。
for dirname in os.listdir(name[0])
path = os.path.join(name[0], dirname)
print('path', path)
for filename in os.listdir(path):
if filename.endswith(".png"):
FileList