【问题标题】:Number of nodes in output later greater than number of classes in a neural network输出中的节点数大于神经网络中的类数
【发布时间】:2020-12-17 23:57:20
【问题描述】:

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

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

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

我附上了一些代码,以便可以重现结果。这是使用 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)

【问题讨论】:

    标签: tensorflow neural-network classification


    【解决方案1】:

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

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

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

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

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

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

    这被传递到第二层并重复相同的过程。

    因此,从本质上讲,即使您的神经元数量多于实际类,您也能够完成前向传播步骤。

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

    要存在反向传播,您必须能够计算 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 - 它们分别代表示例属于第 2 类和第 3 类的概率。但由于标签不包含第 2 类和第 3 类的值,因此它们在计算损失值时的贡献为零。

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

    【讨论】:

      猜你喜欢
      • 2017-09-28
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2019-11-18
      • 2013-11-25
      相关资源
      最近更新 更多