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,2,3]调整为[0,1,2],符合分类任务标签从0起始的默认规则
- 调整模型结构:输出层单元数改为3,激活函数换为
softmax,输出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
相关产品推荐
相关产品推荐

