Keras基于FIFA19数据集训练模型时loss为nan、准确率为0问题求助
问题排查及解决方案
1. 空值处理逻辑失效
data.dropna().replace(np.nan, 0) 未赋值回原data变量,pandas的此类操作默认返回新DataFrame,原数据集的空值没有被处理,训练时输入空值会直接导致损失为nan。
修正方式:将该行改为 data = data.dropna().replace(np.nan, 0)
2. 归一化逻辑错误
你使用的归一化公式存在两处问题:
- 公式写反:常规min-max归一化应该是
(样本值 - 最小值)/(最大值 - 最小值),你写为了减最大值,会导致所有输入特征为非正数,后续经过ReLU激活时容易出现神经元坏死、梯度消失的问题 - 除零风险:如果某特征的最大值等于最小值,分母为0会生成inf值,输入模型后直接导致损失为nan
修正方式:替换归一化逻辑,也可以直接用sklearn的MinMaxScaler避免手动计算出错:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test)
3. 评估指标选择错误
accuracy是分类任务专属的评估指标,你当前做的是连续值预测的回归任务,预测值几乎不可能和真实标签完全相等,所以accuracy恒为0属于正常现象。
修正方式:编译模型时更换为回归类指标,比如metrics=["mae"]
4. 输出层激活函数不合理
回归任务预测的是无边界的连续值,输出层不需要加ReLU激活函数,否则会强制截断负输出,影响拟合效果。
修正方式:将输出层改为 keras.layers.Dense(1)
修正后可运行的核心代码片段
# 数据清洗部分修正 data = pd.read_csv("./data.csv") data = data.dropna().replace(np.nan, 0) # 新增赋值操作 data.columns = [x.lower() for x in data.columns] data = data.select_dtypes(include="number").drop(columns = ["id", "unnamed: 0"], axis=1) y = data["overall"] X = data[["crossing", "headingaccuracy", "standingtackle", "gkreflexes"]] X_train, X_test, y_train, y_test = train_test_split(X,y, random_state=45) # 归一化修正 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) y_train = np.array(y_train, dtype = 'float32') # 模型部分修正 model = keras.models.Sequential([ keras.layers.Dense(4, input_shape=(4,), activation='relu'), # 给第一层添加激活函数优化拟合效果 keras.layers.Dense(128, activation='relu'), keras.layers.Dense(1) # 移除输出层的relu激活 ]) # 更换评估指标,优化器替换为Adam降低调参难度 model.compile(optimizer="adam", loss="mean_squared_error", metrics=["mae"]) model.fit(X_train, y_train, epochs=20, validation_split=0.2)
内容的提问来源于stack exchange,提问作者user14230292
相关产品推荐
相关产品推荐

