Понимание целевых данных для выходного слоя softmax - PullRequest
2 голосов
/ 28 февраля 2020

Я нашел пример кода для проблемы классификации рукописных символов MNIST. Начало кода выглядит следующим образом:

import tensorflow as tf

# Load in the data
mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
print("x_train.shape:", x_train.shape)

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])
# Compile the model
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
# Train the model
r = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10)

Глядя на код, кажется, что выходной уровень сети состоит из десяти узлов. Если сеть работала отлично после обучения, тогда (соответствующий) один из десяти выходов имел бы активацию, очень близкую к единице, а остальные должны иметь активации, очень близкие к нулю.

Я знал, что тренировочный набор содержит 60000 примеров. Поэтому я предположил, что целевые выходные данные (y_train) будут представлять собой массив 2D numpy с формой 60000x10. Я решил перепроверить и выполнил print(y_train.shape) и был очень удивлен, увидев, что он говорит (60000,) ... Обычно вы ожидаете, что размер целевых шаблонов будет таким же, как количество узлов в выходном слое. Я подумал: «Хорошо, конечно, softmax - это необычный особый случай, если нам нужна только одна цель» ... Моя следующая мысль была - как я мог узнать это из любой документации? ... пока я не смог найти что-нибудь.

1 Ответ

2 голосов
/ 28 февраля 2020

Я думаю, что вы искали в неправильном направлении. Это не из-за softmax. Функция Softmax (не слой) получает n значений и выдает n значений. Это из-за потери sparse_categorical_crossentropy.

В официальном документе вы можете проверить, что должны давать целевые значения в виде целых чисел метки. Вы также можете видеть, что есть точно такая же потеря, в которой в качестве целевых значений используется форма (60000,10), то есть потеря КатегориальногоЦентропии.

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

...