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

Keras是否仅支持二进制输出?设置非二进制输出时准确率为0是什么原因

Keras非二进制输出准确率为0的问题解答

Keras完全支持多分类、回归等非二进制输出场景,你遇到的问题是代码配置与任务不匹配导致的,具体原因和修改方案如下:

问题原因

  • 输出层激活函数错误:当前输出层使用的sigmoid激活输出范围固定为0~1,无法输出大于1的数值,完全不可能匹配[1,2,3]的标签,预测值和真实值无匹配项,准确率自然为0。
  • 损失函数不匹配:你当前使用的mean_squared_logarithmic_error是回归任务损失,若你的[1,2,3]是分类标签,需要使用分类任务对应的损失函数。
  • 评估指标逻辑不匹配:默认配置下,单输出sigmoid对应的准确率是二分类判断逻辑(预测值>0.5判定为1,否则为0),完全无法适配3分类的判断规则。

修改方案

若你做的是3分类任务

按如下规则调整代码:

  1. 标签预处理:将原标签[1,2,3]调整为[0,1,2],符合分类任务标签从0起始的默认规则
  2. 调整模型结构:输出层单元数改为3,激活函数换为softmax,输出3个类别的预测概率
  3. 调整编译参数:损失函数改用sparse_categorical_crossentropy(无需对标签做独热编码),若你已提前对标签做独热编码,可改用categorical_crossentropy

修改后的核心代码示例:

from keras.models import Sequential
from keras.layers import Dense
import numpy
from numpy import loadtxt

numpy.random.seed(7)

dataset = loadtxt('Trial.csv', delimiter=',')
X = dataset[:,0:2]
Data_1 = X.astype('float32')
y = dataset[:,3]
# 标签转0起始
Data_2 = (y - 1).astype("int32")

model = Sequential()
# 中间层建议用relu替换sigmoid,避免梯度消失,训练效果更好
model.add(Dense(64, input_dim=2, activation='relu'))
model.add(Dense(64, activation='relu'))
# 3分类输出层
model.add(Dense(3, activation='softmax'))

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(Data_1, Data_2, epochs=15, batch_size=100)

_, accuracy = model.evaluate(Data_1, Data_2)
print('Accuracy: %.2f' % (accuracy*100))

若你做的是回归任务

如果[1,2,3]是连续预测值而非分类标签,你不应该使用accuracy作为评估指标,准确率是分类任务专属指标,回归任务应使用MAE、MSE等回归指标,调整方式如下:

model = Sequential()
model.add(Dense(64, input_dim=2, activation='relu'))
model.add(Dense(64, activation='relu'))
# 回归任务输出层不需要激活
model.add(Dense(1))
# 改用回归损失和回归评估指标
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:04