加载EMNIST字母数据集

时间:2018-07-01 18:35:46

标签: python python-3.x matlab numpy mnist

我一直在尝试找到一种方法来加载EMNIST字母数据集,但没有成功。我在结构中发现了有趣的东西,无法回避正在发生的事情。这是我的意思:

我下载了.mat格式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)

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

如果有人可以告诉我这是怎么回事,我将不胜感激

4 个答案:

答案 0 :(得分:4)

另一种解决方案是使用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']

并选择第一个示例中的“数字”。

这为您提供了numpy数组中的所有数据,我发现这些数据使操作变得容易。

答案 1 :(得分: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:https://www.kaggle.com/crawford/emnist上使用EMNIST数据集的CSV版本:是785列,其中第一列= class_label,后面的每一列代表一个像素值(28 x 28图像总计784)。

答案 2 :(得分: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]

还有一个额外的字段“ writers”(例如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')

答案 3 :(得分: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')