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
相关产品推荐
相关产品推荐

