【问题标题】:loading EMNIST-letters dataset加载 EMNIST 字母数据集
【发布时间】:2018-12-10 01:54:10
【问题描述】:

我一直在尝试找到一种方法来加载 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)

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

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

【问题讨论】:

  • 我建议你在 Spyder 上运行它并在变量资源管理器中查看它。
  • 即使在这个情况下它似乎也不起作用,我无法探索变量

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


【解决方案1】:

由于数据集的结构方式,可以使用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第一列 = class_label 的列,之后的每一列代表一个像素值(28 x 28 图像总共 784 个)。

【讨论】:

    【解决方案2】:

    @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 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 使用 column-major排序,就像 Fortran。reference)。例如-

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

    【讨论】:

      【解决方案3】:

      另一种解决方案是使用 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 数组中的所有数据,我发现这些数据使事情变得易于使用。

      【讨论】:

        【解决方案4】:

        我建议从 Yann LeCun 网站下载“二进制格式为 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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-07-10
          • 2020-09-02
          • 1970-01-01
          • 2023-01-03
          • 2019-11-24
          • 2020-04-25
          • 1970-01-01
          相关资源
          最近更新 更多