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

如何获取Keras-LSTM模型对Quora问答对的二分类预测结果?

解决Quora问答对重复检测的二分类输出问题

嘿,刚好碰到过类似的场景,我来给你捋清楚怎么把模型输出的概率转成0/1的二分类结果!

首先,你现在用sigmoid激活函数输出的是0到1之间的概率值(代表属于“重复”类别1的概率),这完全没问题——训练阶段就该用这个概率来计算损失(比如BinaryCrossentropy),因为梯度需要连续值才能正常传播。要得到0或1的分类结果,只需要在预测阶段加一步简单的阈值判断就行,具体操作如下:

一、核心思路:设置分类阈值

最常用的阈值是0.5:

  • 如果预测概率 >= 0.5,判定为重复(类别1)
  • 如果预测概率 < 0.5,判定为不重复(类别0)
    当然你也可以根据业务需求调整阈值(比如想减少误判就调高阈值),但0.5是二分类任务的默认选择。

二、代码实现

结合你给出的LSTM模型片段,我给你补全关键部分的处理:

1. 模型训练阶段(保持不变)

你的现有逻辑没问题,训练时还是要输出概率用于损失计算,注意二分类的输出维度应该是1:

merged = RNN(EMBED_HIDDEN_SIZE)(merged)
merged = layers.Dropout(dropoutp)(merged)
# 二分类任务的Dense层输出维度设为1,sigmoid输出0-1的概率
preds = layers.Dense(1, activation='sigmoid')(merged)  
model = Model([questiona, questionb], preds)  # 假设输入是两个待对比的问句
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

⚠️ 这里提醒下:如果你的answer_size之前设的不是1,记得改成1,因为二分类只需要单个输出节点对应概率值。

2. 预测阶段(转换为0/1标签)

当你用训练好的模型做预测时,把输出的概率转成整数标签:

import numpy as np

# 假设你有测试数据test_questiona, test_questionb
pred_probs = model.predict([test_questiona, test_questionb])

# 方法1:用round直接四舍五入(等价于0.5阈值)
pred_labels = np.round(pred_probs).astype(int)

# 方法2:手动设置阈值,更灵活(比如想降低误判率可以调到0.6)
threshold = 0.5
pred_labels = (pred_probs >= threshold).astype(int)

这样pred_labels就是你要的0或1的二分类结果了,直接和真实标签y对比就能计算准确率、召回率这些指标。

三、额外提醒

  • 不要在模型内部直接加硬转换(比如用tf.cast(preds >=0.5, int)作为输出),这样训练时会丢失梯度,模型根本学不起来!
  • 如果需要在训练过程中查看分类效果,可以在每个epoch结束后,对验证集的预测概率做同样的转换,再计算准确率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:31:02