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

Keras Sequential模型predict返回NaN问题求助

解决神经网络预测全NaN的问题

核心原因

预测输出全NaN的本质是梯度爆炸导致权重溢出,你的代码里有两个关键诱因:

  1. 学习率设置过高(SGD(lr=1)),线性激活下大学习率会让权重更新幅度过大,直接变成NaN
  2. 输入数据未做标准化,特征值范围差异大进一步加剧了梯度不稳定

具体修复方案

  • 降低学习率:把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:10:30