加载EMNIST字母数据集

问题描述 投票:0回答:3

我一直试图找到一种方法来加载EMNIST字母数据集,但没有取得多大成功。我在结构中找到了有趣的东西,无法围绕正在发生的事情。这就是我的意思:

我下载了.mat格式的in here

我可以使用加载数据

import scipy.io
mat = scipy.io.loadmat('letter_data.mat') # renamed for conveniance

它是一个字典,键如下:

dict_keys(['__header__', '__version__', '__globals__', 'dataset'])

唯一感兴趣的关键是数据集,我无法从中收集数据。打印它的形状给出:

>>>print(mat['dataset'].shape)
(1, 1)

我越来越深地挖掘出一个看起来有点像真实数据集的形状,并且遇到了这个:

>>>print(mat['dataset'][0][0][0][0][0][0].shape)
(124800, 784)

这正是我想要的但我无法找到标签和测试数据,我尝试了很多东西,但似乎无法理解这个数据集的结构。

如果有人能告诉我这是怎么回事,我会很感激

python python-3.x matlab numpy mnist
3个回答
2
投票

由于数据集的结构方式,可以使用mat['dataset'][0][0][0][0][0][0]和带有mat['dataset'][0][0][0][0][0][1]的标签数组数组访问图像数组。例如,print(mat['dataset'][0][0][0][0][0][0][0])将打印出第一张图像的像素值,而print(mat['dataset'][0][0][0][0][0][1][0])将打印第一张图像的标签。

对于较少...复杂的数据集,我实际上建议在Kaggle上使用GPNIST数据集的CSV版本:https://www.kaggle.com/crawford/emnist,其中每行是一个单独的图像,有785列,其中第一列= class_label,每列后面代表一个像素值(28 x 28图像总共784个)。


1
投票

@Josh Payne的答案是正确的,但我会为那些想要使用.mat文件并强调典型数据拆分的人扩展它。

数据本身已经分成训练和测试集。这是我访问数据的方式:

    from scipy import io as sio
    mat = sio.loadmat('emnist-letters.mat')
    data = mat['dataset']

    X_train = data['train'][0,0]['images'][0,0]
    y_train = data['train'][0,0]['labels'][0,0]
    X_test = data['test'][0,0]['images'][0,0]
    y_train = data['test'][0,0]['labels'][0,0]

有一个额外的字段'作者'(例如data['train'][0,0]['writers'][0,0])区分原始样本编写者。最后,还有另一个字段data['mapping'],但我不确定是什么映射数字。

此外,在Secion II D中,EMNIST paper声明“训练集的最后一部分,与测试集相同,被留作验证集”。奇怪的是,.mat文件训练/测试大小与表II中列出的数字不匹配,但它确实与图2中的大小相匹配。

    val_start = X_train.shape[0] - X_test.shape[0]
    X_val = X_train[val_start:X_train.shape[0],:]
    y_val = y_train[val_start:X_train.shape[0]]
    X_train = X_train[0:val_start,:]
    y_train = y_train[0:val_start]

如果您不想要验证集,可以将这些样本留在训练集中。

此外,如果您想将数据重新整形为2D,28x28大小的图像而不是1D 784阵列,为了获得正确的图像方向,您需要使用Fortran排序进行numpy重塑(Matlab使用列主要排序,只需像Fortran.reference)。例如 -

    X_train = X_train.reshape( (X_train.shape[0], 28, 28), order='F')

0
投票

我建议下载'二进制格式为original MNIST dataset'。

解压缩下载的文件,然后使用Python解压缩:

import idx2numpy

X_train = idx2numpy.convert_from_file('./emnist-letters-train-images-idx3-ubyte')
y_train = idx2numpy.convert_from_file('./emnist-letters-train-labels-idx1-ubyte')

X_test = idx2numpy.convert_from_file('./emnist-letters-test-images-idx3-ubyte')
y_test = idx2numpy.convert_from_file('./emnist-letters-test-labels-idx1-ubyte')
© www.soinside.com 2019 - 2024. All rights reserved.