多类别情况下最后一个密集输出层的单位

Units of the last dense output layer in case of multiple categories

我目前正在处理这个 colab。任务是将句子分类到某个类别中。所以我们有一个多类别问题,而不是二元问题,比如根据某些评论句子预测评论的情绪(正面/负面)。在多个类别的情况下,我认为最后一层中 units/neurons 的数量必须与我想要预测的 类 的数量相匹配。所以当我有一个二进制问题时,我使用一个神经元,表示 0 或 1。当我有 5 类 时,我需要 5 个单位。我也是这么想的。

但是在colab的代码中有如下内容:

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(6, activation='softmax')
])
model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
model.summary()

当我 运行 此 colab 中的 model.fit 代码部分时,它确实有效。但我不明白。当我检查

print(label_tokenizer.word_index)
print(label_tokenizer.word_docs)
print(label_tokenizer.word_counts)

这给

{'sport': 1, 'business': 2, 'politics': 3, 'tech': 4, 'entertainment': 5}
defaultdict(<class 'int'>, {'tech': 401, 'business': 510, 'sport': 511, 'entertainment': 386, 'politics': 417})
OrderedDict([('tech', 401), ('business', 510), ('sport', 511), ('entertainment', 386), ('politics', 417)])

如此清楚 5 类。但是,当我将模型调整为 tf.keras.layers.Dense(5, activation='softmax') 和 运行 时,model.fit 命令不起作用。准确度始终为 0。

为什么这里是 6 而不是 5?

是 6,因为编码目标在 [1,5] 中,但是 keras sparse_cat 从 0 创建了 one-hot 标签,因此它创建了另一个无用的标签 (0)。

要使用 Dense(5, activation='softmax'),您只需执行 y-1 即可获得 [0,4] 中的标签并从 0

开始

在 colab link 之后,您可以更改:

model = tf.keras.Sequential([
    tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(5, activation='softmax')
])

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

history = model.fit(train_padded, training_label_seq-1, epochs=num_epochs, validation_data=(validation_padded, validation_label_seq-1), verbose=2)