输出中的节点数晚于神经网络中 类 的数量

Number of nodes in output later greater than number of classes in a neural network

在训练神经网络时,在时尚 mnist 数据集上,我决定在我的输出层中拥有比数据集中 类 数量更多的节点。
数据集有 10 个 类,而我训练我的网络在输出层有 15 个节点。我还使用了 softmax。
现在令人惊讶的是,这给了我 97% 的准确率,这非常好。

这让我想到了一个问题,那些额外的 5 个节点到底是什么意思,它们在这里有什么作用?
当标签范围(0-9)不等于节点数(15)时,为什么我的softmax能够正常工作?
最后,一般来说,在分类任务中,输出层中的节点数多于 类 的节点数意味着什么?

我了解节点数少于 类 的影响,并且经验法则是使用节点数 = 类 的数量。然而,我从未见过有人使用更多的节点,我想理解 why/why 不是。

我附上了一些代码以便可以重现结果。这是使用 Tensorflow 2.3

完成的
import tensorflow as tf
print(tf.__version__)

mnist = tf.keras.datasets.mnist

(training_images, training_labels) ,  (test_images, test_labels) = mnist.load_data()

training_images = training_images/255.0
test_images = test_images/255.0

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),
                                    tf.keras.layers.Dense(256, activation=tf.nn.relu),
                                    tf.keras.layers.Dense(15, activation=tf.nn.softmax)])

model.compile(optimizer = 'adam',
              loss = 'sparse_categorical_crossentropy',
              metrics = ['accuracy'])

model.fit(training_images, training_labels, epochs=5)

model.evaluate(test_images, test_labels)

您能够使用这种配置的唯一原因是因为您已将损失函数指定为 sparse_categorical_crossentropy。

让我们了解更大的输出节点在前向传播中的影响。
考虑一个有 2 层的神经网络。
第一层 - 6 个神经元(隐藏层)
第二层 - 4 个神经元(输出层)

你的数据集 X 的形状是 (100*12) 即。 12 个特征和 100 行。
您的标签 y 的形状为 (100,),其中包含两个唯一值 0 和 1。
因此,本质上这是一个二进制 class 化问题,但我们将在输出层中使用 4 个神经元。

将每个神经元视为逻辑回归单元。因此你的每个神经元将有 12 个权重 (w1, w2,......,w12)
为什么? - 因为你有 12 个特征。

每个神经元将输出一个由a给出的单项。我将分两步给出a的计算。
z = w1x1 + w2x2 + ....... + w12*x12 + w0 # w0 是偏差
a = 激活(z)

因此,您的第 1 层将为数据集中的每一行输出 6 个值。 所以现在你有一个 100 * 6 的特征矩阵。

这将传递到第 2 层并重复相同的过程。

所以本质上,即使你的神经元比实际的 classes 多,你也能够完成前向传播步骤。

现在让我们看看反向传播。

要存在反向传播,您必须能够计算 loss_value。
我们举个小例子:
y_true 在我们的问题中有两个标签,y_pred 有 4 个概率值,因为我们在最后一层有 4 个单元。

y_true = [0, 1]
y_pred = [[0.03, 0.90, 0.02, 0.05], [0.15, 0.02, 0.8, 0.03]]
# Using 'auto'/'sum_over_batch_size' reduction type.
scce = tf.keras.losses.SparseCategoricalCrossentropy()
scce(y_true, y_pred).numpy() # 3.7092905

如何计算: ( log(0.03) + log(0.02) ) / 2

所以基本上我们可以计算损失,所以我们也可以计算它的梯度。

因此使用反向传播也没有问题。

因此我们的模型可以很好地训练并达到 90% 的准确率。

所以最后一个问题,这些额外的神经元代表什么。即(神经元 2 和神经元 3)。
Ans - 它们分别表示示例为 class 2 和 class 3 的概率。但是由于标签不包含 class 2 和 class 3 的值,因此它们在计算损失值时的贡献为零。

注意 - 如果您将 y_label 编码为 one-hot-encoding 并使用 categorical_crossentropy 作为您的损失,您将遇到错误。