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

TensorFlow模型预测返回NaN值问题求助

解决模型训练与预测出现NaN的问题

核心原因

  • 输入特征未缩放:输入特征值处于130-170的较大数值范围,使用默认学习率(0.01)的SGD优化器时,权重更新步长过大,极易引发梯度爆炸,导致计算过程中出现数值溢出,最终产生NaN。
  • 潜在数据形状不匹配:需确认y_train的形状是否与模型输出兼容(Keras通常自动适配一维标签,但数据加载异常可能引发问题)。

解决方案

1. 归一化输入特征(优先方案)

将输入特征缩放到均值为0、方差为1的标准范围,或0-1区间,这能稳定SGD训练过程,从根源避免数值溢出。

2. 调整优化器学习率

若暂时不做特征缩放,可尝试调小SGD的学习率(例如从0.01改为0.0001),但这仅为临时 workaround,归一化才是更可靠的解决方式。

3. 排查数据完整性

确认combined_data.txt和admit_data.txt中无NaN或异常值,加载后可通过np.isnan(x_train).any()、np.isnan(y_train).any()快速排查。

修改后的完整代码示例

以下是加入特征归一化的可运行代码:

import tensorflow as tf
import numpy as np
from tensorflow import keras
from sklearn.preprocessing import StandardScaler

print(tf.__version__)

# 加载训练数据
x_train = np.loadtxt("combined_data.txt")
y_train = np.loadtxt("admit_data.txt")

# 对输入特征做标准化处理
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)

# 构建模型
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[2])])

# 编译模型(可选:微调学习率提升稳定性)
model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.001), loss='mean_squared_error')

# 训练模型
model.fit(x_train_scaled, y_train, epochs=500)

# 预测时需对输入执行相同的标准化转换
prediction = np.array([[160, 160]])
prediction_scaled = scaler.transform(prediction)
print(model.predict(prediction_scaled))

# 评估模型
loss = model.evaluate(x_train_scaled, y_train)
print(f'Loss: {loss}')

贴合预期输出的额外优化

若希望预测值严格落在0-100区间内,可给输出层添加sigmoid激活函数,再将输出结果乘以100:

# 修改模型定义
model = tf.keras.Sequential([keras.layers.Dense(units=1, input_shape=[2], activation='sigmoid')])
# 编译模型
model.compile(optimizer=keras.optimizers.SGD(learning_rate=0.01), loss='mean_squared_error')

# 预测时转换为0-100范围
print(model.predict(prediction_scaled) * 100)

内容的提问来源于stack exchange,提问作者lzzard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 02:17:09