Keras mnist.load_data() не перемешивает?

Вопрос или проблема

Я хочу провести увеличение данных на MNIST и поэтому должен вручную разметить набор Y. Это можно автоматизировать, если MNIST не перемешан, однако mnist.load_data() кажется возвращает данные в перемешанном состоянии. Как загрузить их с помощью Keras или TensorFlow в неперемешанном состоянии?

ОБНОВЛЕНИЕ: Это тривиально сделать вручную с помощью:

perms=np.where(Y==0)
x[perms] #все X, которые равны 0

Тем не менее, было бы неплохо, если бы Keras имел способ импортировать MNIST напрямую без перемешивания.

Я не верю, что Keras возвращает данные MNIST в перемешанном виде. Вы можете увидеть, что это не так ниже.

Сначала я определю функцию, которую мы будем использовать для красивого отображения данных MNIST.

import matplotlib.pyplot as plt
%matplotlib inline

# вспомогательная функция для показа изображений
def show_imgs(x_test, decoded_imgs=None, n=10):
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i+1)
        plt.imshow(x_test[i].reshape(28,28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)

        if decoded_imgs is not None:
            ax = plt.subplot(2, n, i+ 1 +n)
            plt.imshow(decoded_imgs[i].reshape(28,28))
            plt.gray()
            ax.get_xaxis().set_visible(False)
            ax.get_yaxis().set_visible(False)
    plt.show()

Теперь давайте заново загрузим и отобразим набор данных MNIST 4 отдельных раза. Мы увидим, что порядок этих данных не изменился.

for i in range(4):
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    show_imgs(x_train, x_test)
    print('Обучающие метки: ', y_train[0:10])
    print('Тестовые метки : ', y_test[0:10])

вставьте описание изображения здесь

Обучающие метки: [5 0 4 1 9 2 1 3 1 4]
Тестовые метки : [7 2 1 0 4 1 4 9 5 9]

вставьте описание изображения здесь

Обучающие метки: [5 0 4 1 9 2 1 3 1 4]
Тестовые метки : [7 2 1 0 4 1 4 9 5 9]

вставьте описание изображения здесь

Обучающие метки: [5 0 4 1 9 2 1 3 1 4]
Тестовые метки : [7 2 1 0 4 1 4 9 5 9]

вставьте описание изображения здесь

Обучающие метки: [5 0 4 1 9 2 1 3 1 4]
Тестовые метки : [7 2 1 0 4 1 4 9 5 9]

Ответ или решение

Вопрос: Загрузить MNIST в Keras без перемешивания данных (unshuffled)

Загрузка и обработка наборов данных является важным этапом подготовки к обучению моделей машинного обучения. В этом отношении распространенной библиотекой является Keras, которая предоставляет простой способ загрузки известных наборов данных, в том числе MNIST, с помощью функции mnist.load_data(). Однако некоторые пользователи интересуются, представлен ли этот набор данных в перемешанном виде или нет, особенно при необходимости проводить мануальную маркировку объектов (Y set) для применения аугментации данных.

Как работает mnist.load_data()

Функция mnist.load_data() возвращает кортеж из двух пар: тренировочного и тестового наборов. Каждый из этих наборов состоит из изображений и соответствующих им меток. Как показывает практика, данные, загружаемые с помощью данной функции, не перемешаны. Например, набор данных для обучения (x_train и y_train) возвращается в исходном порядке, что позволяет легко сопоставить изображения с их метками.

from keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

В этом случае, если вы выполните последовательные загрузки данных и визуализацию, вы заметите, что порядок этих данных остается неизменным. Для визуализации можно использовать следующий код:

import matplotlib.pyplot as plt

def show_imgs(x_test, n=10):
    plt.figure(figsize=(20, 4))
    for i in range(n):
        ax = plt.subplot(2, n, i+1)
        plt.imshow(x_test[i].reshape(28,28), cmap='gray')
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    plt.show()

for _ in range(4):
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    show_imgs(x_train)
    print('Training labels: ', y_train[0:10])

Понимание проблемы маркировки данных

Вы отметили, что необходимо использовать данные для аугментации и создать собственный набор меток, что потребует порядка данных. В некоторых случаях, если вам требуется работать с данными в специфическом порядке или объединить их с другими источниками, ручное распределение данных может оказаться проще. Например, используя NumPy, можно извлечь все изображения, соответствующие определенной метке:

import numpy as np

# Для получения всех изображений с меткой 0
perms = np.where(y_train == 0)
x_train_zero = x_train[perms]

Это решение решает вашу задачу по получению данных в нужном вам порядке, не прибегая к перемешиванию.

Заключение

Вопреки распространенным ошибкам, функция mnist.load_data() в Keras не перемешивает данные, что делает ее удобным инструментом для работы с набором MNIST. Если вам все же необходимо, чтобы данные были представлены в определенном порядке, дополнительные манипуляции с массивами, такие как использование NumPy, помогут вам в этом. Это позволяет сохранить оригинальные метки и использовать их в дальнейших алгоритмах аугментации или при построении моделей.

ИспользуюKeras, у вас есть возможность легко и эффективно загружать и обрабатывать данные без лишних трудностей.

Оцените материал
Добавить комментарий

Капча загружается...