TensorFlow文本分类:形状不兼容、损失异常及预测结果转标签问题
问题2:修改后模型损失全程为0
损失为0的可能原因
- 极端过拟合:如果训练数据量极小,模型可以完全记住所有样本的标签,导致损失直接降到0。
- 标签处理错误:检查
get_label_index函数是否正确,比如是否所有标签都被映射为唯一索引,或者是否存在所有样本都被映射到同一个索引的情况。 - 数据泄露:比如训练集和测试集混合,或预处理时泄露了测试集信息。
模型层的必要性
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
相关产品推荐
相关产品推荐

