二分类任务中categorical与binary交叉熵准确率差异问题
问题原因
你遇到的准确率暴跌问题来自3个核心的逻辑不匹配错误:
- 标签被意外反转:你原本的
Target hit列定义为1=命中、0=未命中,直接计算Y = 1 - Ot相当于把正负样本的标签完全颠倒,模型学习的目标和实际任务完全相反,自然会出现准确率大幅下降。 - 输出层结构和任务不匹配:你切换为二分类单标签方案后,没有修改模型输出层的结构:原本用于one-hot二分类的2神经元输出,和单值0/1标签的二分类任务不兼容,
binary_crossentropy损失函数的计算逻辑和输出维度完全错位。 - 原有方案本身存在不规范问题:原本使用
to_categorical转换为one-hot标签时,输出层的激活函数应该用softmax而不是sigmoid,你之前的方案属于刚好能跑的不规范实现,也埋下了精度不稳定的隐患。
另外你现有代码中model.fit(Xt, yt, epochs=150, batch_size=32)里的yt变量未定义,属于明显的笔误,运行时会直接报错;同时你当前的归一化逻辑scaleArray = np.array([np.zeros([6,]), np.ones([6,])])相当于没有做实际的数值缩放,也会影响模型收敛效率。
正确二分类单标签方案修改示例
from keras.models import Sequential from keras.layers import Dense import pandas as pd import numpy as np df = pd.read_csv("dataset1.csv") Lt = np.array(df['Arm length (m)'][:]) Wt = np.array(df['Ball weight (kg)'][:]) Rt = np.array(df['Ball radius (mm)'][:]) Tt = np.array(df['Air temperature (deg C)'][:]) Et = np.array(df['Spring constant (N per m)'][:]) Dt = np.array(df['Device weight (kg)'][:]) XtUnscaled = np.column_stack([Lt, Wt, Rt, Tt, Et, Dt]) # 建议替换为StandardScaler/MinMaxScaler做实际归一化,提升收敛效果 scaleArray = np.array([XtUnscaled.min(axis=0), XtUnscaled.max(axis=0)]) Xt = (XtUnscaled-scaleArray[0,:])/(scaleArray[1,:] - scaleArray[0,:]) # 标签直接用原始值,无需反转 Y = np.array(df['Target hit'][:]) model = Sequential() model.add(Dense(12, input_dim=6, activation='relu')) model.add(Dense(8, activation='relu')) # 二分类单标签输出层改为1个神经元,用sigmoid激活 model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(Xt, Y, epochs=150, batch_size=32) _, accuracy = model.evaluate(Xt, Y) print('Accuracy: %.2f' % (accuracy*100))
内容的提问来源于stack exchange,提问作者Benjy
相关产品推荐
相关产品推荐

