Давайте сначала посмотрим на формат данных Keras MNIST.
>>> from keras.datasets import mnist
>>> (x_train, y_train), (x_test, y_test) = mnist.load_data()
>>> x_train.shape
(60000, 28, 28)
>>> y_train.shape
(60000,)
Таким образом, переменные x_...
содержат изображения, а переменные y_...
содержат метки. Они оба являются массивами Numpy. В каком порядке находятся данные?
>>> y_train[:20]
array([5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5, 3, 6, 1, 7, 2, 8, 6, 9],
dtype=uint8)
Они в СЛУЧАЙНОМ порядке. Это хорошо, если вы хотите взять небольшую часть данных, просто взяв непрерывный срез, легко получить образец, который включает каждую цифру. Но это усложняет задачу, которую вы хотите сделать. Вам нужны индексы, которые соответствуют каждой цифре. Затем вам нужно использовать эти индексы, чтобы выбрать нужные изображения и метки.
Вы хотите взглянуть на метод массива Numpy с именем nonzero()
и понять, как Numpy использует массивы Boolean. значения для выбора элементов из массивов с совместимыми формами. Эта двухстрочная функция будет делать то, что вам нужно:
def remove(digit, x, y):
idx = (y != digit).nonzero()
return x[idx], y[idx]
А вот пример того, как ее вызвать:
x_no3, y_no3 = remove(3, x_train, y_train)