为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

天涯尽头无女友 2023-02-12 19:01:44
我目前正在研究这个colab。任务是将句子分类到某个类别中。所以我们有一个多类别问题,而不是二元问题,比如根据某些评论句子预测评论的情绪(正面/负面)。在多个类别的情况下,我认为最后一层中的单元/神经元数量必须与我想要预测的类别数量相匹配。所以当我有一个二元问题时,我使用一个神经元,表示 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?
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

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


使用Dense(5, activation='softmax')你可以简单地做 y-1 以获得 [0,4] 中的标签并让它们从 0 开始


在 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(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)



查看完整回答
反对 回复 2023-02-12
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信