Вопрос или проблема
Я хочу провести увеличение данных на 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, у вас есть возможность легко и эффективно загружать и обрабатывать данные без лишних трудностей.