Целевой вектор Keras MNIST автоматически конвертируется в горячий? - PullRequest
0 голосов
/ 20 июня 2020

Когда я загружаю набор данных mnist из Keras, я получаю 4 переменные -

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

Форма x_train - (60000, 28, 28), что имеет смысл, потому что он содержит 60000 изображений 28x28

Форма y_train равна (60000,), что показывает, что это одномерный вектор, содержащий числовые c целевые метки (0-9).

Для запуска di git, нейронные сети обычно выводят вектор с горячим кодированием, который будет иметь десять измерений. Я думал, что мне нужно использовать to_categorical для преобразования цели y из числового в категориальный, чтобы выходной сигнал нейронной net формы соответствовал обучающим образцам, что предположительно будет (60000, 10).

Но в нескольких примерах, которые я нашел в Интернете, to_categorical никогда не использовался для изменения вектора обучения. y_train.shape осталось (60000,), в то время как выходной слой нейронного net был

 model.add(Dense(10, activation="softmax"))

, который выводит 10-мерный односторонний вектор.

А затем они просто обучили модель на y_train без проблем

model.fit(x_train, y_train, epochs=2, validation_data=(x_test, y_test))

Как такое возможно? Разве вывод нейронной системы net, который имел бы форму (60000, 10), не был бы несовместим с (60000,)? Или Keras автоматически преобразует категориальный вывод в numeri c?

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

EDIT: Рошин был прав . Это просто эффект использования sparse_crossentropy потерь, а не категориальных.

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Измените функцию потерь на

loss = 'sparse_categorical_crossentropy'

Это будет работать, и вам не нужно менять форму входных данных

0 голосов
/ 20 июня 2020

Вы можете самостоятельно преобразовать его в горячую, выполнив следующие строки кода:

(x_train, l_train), (x_test, l_test) = mnist.load_data()
y_train = np.zeros((l_train.shape[0], l_train.max()+1), dtype=np.float32)
y_train[np.arange(l_train.shape[0]), l_train] = 1
y_test = np.zeros((l_test.shape[0], l_test.max()+1), dtype=np.float32)
y_test[np.arange(l_test.shape[0]), l_test] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...