了解 softmax 输出层的目标数据

Understanding target data for softmax output layer

我找到了一些 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)

查看代码,网络的输出层似乎由十个节点组成。如果网络在训练后运行良好,那么(适当的)十个输出之一的激活值将非常接近于 1,而其余输出的激活值应该非常接近于零。

我知道训练集包含 60000 个示例模式。因此,我假设目标输出数据 (y_train) 是一个形状为 60000x10 的 2D numpy 数组。我决定仔细检查并执行 print(y_train.shape) 并且非常惊讶地看到它说 (60000,)... 通常你会期望看到目标模式的大小与节点的数量相同输出层。我心想,"OK, well obviously softmax is an unusual special case were we only need one target"...我的下一个想法是 - 我怎么能从任何文档中知道这一点?...到目前为止我没有找到任何东西。

我认为您搜索的方向错误。这不是因为 softmax。 Softmax 函数(不是层)接收 n 个值并产生 n 个值。这是因为 sparse_categorical_crossentropy 损失。

official document 中,您可以检查是否应该将目标值作为标签整数给出。您还可以看到有一个完全相同的损失,它使用 (60000,10) 的形状作为目标值,即 CategoricalCrossentropy 损失。

您可以根据提供的数据格式选择使用哪种损失。由于 MNIST 数据被标记为整数而不是单热编码,因此教程使用 SparseCategoricalCrossentropy 损失。