加载EMNIST字母数据集。

6

我一直在尝试找到一种加载EMNIST字母数据集的方法,但没有太大的成功。我发现结构中有趣的内容,但是无法理解正在发生的事情。这就是我的意思:

我下载了这里的.mat格式

我可以使用以下方式加载数据

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)

这正是我想要的,但我找不到标签或测试数据,我尝试了许多方法,但似乎无法理解这个数据集的结构。

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


我建议你在Spyder上运行它并在变量浏览器中查看。 - PyMatFlow
1
即使在这种情况下,它似乎也无法工作,我无法探索变量。 - Tissuebox
4个回答

6
由于数据集的结构,可以使用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上EMNIST数据集的CSV版本:https://www.kaggle.com/crawford/emnist,其中每一行都是单独的图像,有785列,其中第一列=类别标签,每个像素值表示一个列(28 x 28图像总共784个)。

6

另一种解决方案是使用EMNIST Python包。(完整详情请参见https://pypi.org/project/emnist/

这使您可以在环境中运行pip install emnist,然后导入数据集(第一次运行程序时将下载数据集)。

以下是该网站上的示例:

  >>> from emnist import extract_training_samples
  >>> images, labels = extract_training_samples('digits')
  >>> images.shape
  (240000, 28, 28)
  >>> labels.shape
  (240000,)

您可以列出数据集。
 >>> from emnist import list_datasets
  >>> list_datasets()
  ['balanced', 'byclass', 'bymerge', 'digits', 'letters', 'mnist']

在第一个示例中,将“digits”替换为您的选择。

这将使您得到所有的数据都存储在numpy数组中,我发现这样做可以方便地处理。


5

@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_test = data['test'][0,0]['labels'][0,0]

还有一个额外的字段“writers” (例如data['train'][0,0]['writers'][0,0]),用来区分原始样本作者。最后,还有另一个字段data['mapping'],但我不确定它映射到哪些数字。

此外,在II D节中,EMNIST论文指出,“与测试集大小相等的训练集一部分被保留为验证集。”奇怪的是,.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')

4
我建议从Yann LeCun的网站下载“二进制格式作为原始MNIST数据集”。解压下载的文件,然后使用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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接