загрузка EMNIST-наборов букв - PullRequest
0 голосов
/ 01 июля 2018

Я пытался найти способ загрузить набор данных EMNIST-letters, но без особого успеха. Я нашел интересные вещи в структуре и не могу обернуться вокруг происходящего. Вот что я имею в виду:

Я скачал формат .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)

это именно то, что я хотел, но я не могу найти ни метки, ни тестовые данные, я пробовал много вещей, но, похоже, не понимаю структуру этого набора данных.

Если бы кто-то мог сказать мне, что происходит с этим, я был бы признателен

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

@ Ответ Джоша Пейна верен, но я остановлюсь на нем для тех, кто хочет использовать файл .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 говорится, что «последняя часть обучающего набора, равная по размеру тестовому набору, отложена в качестве набора проверки». Как ни странно, размер обучения / тестирования файла .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]

Если вам не нужен проверочный набор, можно оставить эти образцы в обучающем наборе.

Кроме того, если вы хотите преобразовать данные в двухмерные изображения размером 28x28 вместо массива 1D 784, чтобы получить правильную ориентацию изображения, вам потребуется выполнить цифровую коррекцию с использованием порядка в Fortran (Matlab использует столбец-мажор упорядочение, так же, как Фортран. ссылка ). например -

    X_train = X_train.reshape( (X_train.shape[0], 28, 28), order='F')
0 голосов
/ 01 мая 2019

Я предлагаю скачать 'Двоичный формат как оригинальный набор данных 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')
0 голосов
/ 02 июля 2018

Из-за структуры набора данных доступ к массиву массивов изображений можно получить с помощью 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]) напечатает метку первого изображения.

Для менее ... свернутого набора данных я бы действительно рекомендовал использовать CSV-версию набора данных EMNIST для Kaggle: https://www.kaggle.com/crawford/emnist,, где каждая строка представляет собой отдельное изображение, есть 785 столбцов, где первый столбец = class_label, а каждый последующий столбец представляет одно пиксельное значение (всего 784 для изображения 28 x 28).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...