如何查看神经网络分类错误的测试文本数据?
查看Keras训练IMDB模型时的错误分类文本
我来一步步教你找出这些被错分的文本,先把完整流程理清楚:
第一步:补全训练代码并得到预测结果
你给的代码片段不完整,我先补一个能正常运行的基础版本,确保能拿到模型的预测结果:
import numpy as np import keras from keras.datasets import imdb from keras.models import Sequential from keras.layers import Dense, Activation, Dropout, Conv1D, GlobalMaxPooling1D from keras.preprocessing.text import Tokenizer from keras import optimizers np.random.seed(42) max_features = 10000 # 只保留最常见的10000个单词 max_len = 500 # 文本统一截断/填充到500词长度 # 加载原始数据集(要保留原始数字序列,后续解码用) (x_train_raw, y_train), (x_test_raw, y_test) = imdb.load_data(num_words=max_features) # 预处理:将数字序列转为模型输入的二进制矩阵 tokenizer = Tokenizer(num_words=max_features) x_train = tokenizer.sequences_to_matrix(x_train_raw, mode='binary') x_test = tokenizer.sequences_to_matrix(x_test_raw, mode='binary') # 构建并训练模型(用你提到的Conv1D结构) model = Sequential() model.add(Conv1D(128, 5, activation='relu', input_shape=(max_features,))) model.add(GlobalMaxPooling1D()) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['accuracy']) history = model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.2) # 获取测试集预测结果,并转为0/1标签(二分类阈值设为0.5) y_pred = model.predict(x_test) y_pred_labels = (y_pred > 0.5).astype(int).flatten()
第二步:定位错误分类的样本索引
对比真实标签和预测标签,找出不一致的样本位置:
# 筛选出所有错误分类的样本索引 error_indices = np.where(y_pred_labels != y_test)[0] print(f"测试集里一共有 {len(error_indices)} 个错误分类的样本")
第三步:把数字编码转回原始文本
IMDB数据集的文本是用数字编码的,我们需要把数字映射回单词:
# 获取官方的单词-数字映射表 word_index = imdb.get_word_index() # 反转映射(数字转单词),注意调整索引:原始数据的数字比映射表大3,对应特殊标记 reverse_word_index = {value + 3: key for (key, value) in word_index.items()} reverse_word_index[0] = '<PAD>' # 填充标记 reverse_word_index[1] = '<START>' # 文本起始标记 reverse_word_index[2] = '<UNKNOWN>' # 未知单词标记 # 定义解码函数:把数字序列转成可读文本 def decode_review(text_sequence): return ' '.join([reverse_word_index.get(i, '<UNKNOWN>') for i in text_sequence])
第四步:查看错误分类的文本详情
最后就可以遍历错误样本,打印出文本内容、真实标签和预测标签了:
# 打印前10个错误样本(你可以自己调整数量) for idx in error_indices[:10]: print(f"样本序号: {idx}") print(f"真实标签: {'正面评价' if y_test[idx] == 1 else '负面评价'}") print(f"预测标签: {'正面评价' if y_pred_labels[idx] == 1 else '负面评价'}") print(f"文本内容: {decode_review(x_test_raw[idx])}") print("-" * 80)
小提醒
如果想找训练集里的错误样本,逻辑完全一样,只要把代码里的x_test_raw、y_test换成x_train_raw、y_train就行。
内容的提问来源于stack exchange,提问作者Midnight
相关产品推荐
相关产品推荐

