You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow文本分类:形状不兼容、损失异常及预测结果转标签问题

问题2:修改后模型损失全程为0

损失为0的可能原因

  1. 极端过拟合:如果训练数据量极小,模型可以完全记住所有样本的标签,导致损失直接降到0。
  2. 标签处理错误:检查get_label_index函数是否正确,比如是否所有标签都被映射为唯一索引,或者是否存在所有样本都被映射到同一个索引的情况。
  3. 数据泄露:比如训练集和测试集混合,或预处理时泄露了测试集信息。

模型层的必要性

  • GlobalAveragePooling1D:必须保留,它把Embedding输出的序列特征(None, 250, 100)压缩成(None, 100)的全局特征,是连接序列层和分类层的核心步骤。
  • Dropout:用于防止过拟合,尤其是模型容量较大或训练数据较少时建议保留;如果后续验证集表现稳定,也可以尝试去掉对比效果。

问题3:预测结果转换为对应标签

你的模型输出是logits(未经过softmax的原始得分),转换步骤如下:

1. 将logits转换为概率

使用softmax函数将每个样本的得分转换为对应标签的概率(所有标签概率之和为1):

import numpy as np
from tensorflow.keras import activations

predictions = model.predict(x_test)
# 转换为概率
probabilities = activations.softmax(predictions).numpy()

2. 获取预测标签的索引

取每个样本概率最大的索引,对应预测的类别:

predicted_indices = np.argmax(probabilities, axis=1)

3. 映射回标签文本

假设你有标签到索引的字典label_to_idx(比如{'Science':0, 'Art':1,...}),创建反向字典:

idx_to_label = {v: k for k, v in label_to_idx.items()}
# 转换为标签文本
predicted_labels = [idx_to_label[idx] for idx in predicted_indices]

如果是多标签任务(每个样本可能有多个标签),则需要设置概率阈值(比如0.5),筛选出概率大于阈值的标签:

# 多标签场景下,用sigmoid转换为每个标签的独立概率
probabilities = activations.sigmoid(predictions).numpy()
# 筛选概率大于阈值的标签索引
predicted_indices = [np.where(prob > 0.5)[0] for prob in probabilities]
# 映射为标签文本
predicted_labels = [[idx_to_label[idx] for idx in indices] for indices in predicted_indices]

内容的提问来源于stack exchange,提问作者cuneyttyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:20:44