Когда я загружаю набор данных 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
потерь, а не категориальных.