Keras Sequential模型predict返回NaN问题求助
解决神经网络预测全NaN的问题
核心原因
预测输出全NaN的本质是梯度爆炸导致权重溢出,你的代码里有两个关键诱因:
- 学习率设置过高(
SGD(lr=1)),线性激活下大学习率会让权重更新幅度过大,直接变成NaN - 输入数据未做标准化,特征值范围差异大进一步加剧了梯度不稳定
具体修复方案
- 降低学习率:把SGD的学习率调至合理范围,比如
0.001或0.01,根据收敛情况逐步调整toyes.compile(loss='mean_squared_error', optimizer=SGD(lr=0.001)) - 输入数据标准化:用标准化统一特征范围,避免梯度波动过大
from sklearn.preprocessing import StandardScaler # 训练集拟合并转换 scaler = StandardScaler() x_train_scaled = scaler.fit_transform(x_train.values) # 测试集用训练集的scaler转换 x_test_scaled = scaler.transform(x_test.values) # 用标准化后的数据训练和预测 toyes.fit(x_train_scaled, np.asarray(y_train).reshape(-1,1), epochs=1500, verbose=1) predictions = toyes.predict(x_test_scaled) - 添加权重约束:限制权重范围防止溢出
from tensorflow.keras.constraints import MaxNorm toyes = Sequential() toyes.add(Dense(units=4, activation='linear', input_dim=5, kernel_constraint=MaxNorm(3))) toyes.add(Dense(units=1, activation='linear', kernel_constraint=MaxNorm(3))) - 梯度裁剪:编译时限制梯度大小
toyes.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01, clipnorm=1.0))
验证建议
训练时打开verbose=1,观察loss变化:如果loss变为NaN,说明梯度问题仍存在,继续调小学习率;如果loss稳定下降,说明问题已解决。
内容的提问来源于stack exchange,提问作者misoneder
相关产品推荐
相关产品推荐

