TensorFlow训练二次函数预测模型时Loss停滞问题求助
解决TensorFlow训练二次函数预测模型Loss停滞的问题
核心问题与修复步骤:
模型未返回
你的create_model函数没有返回训练后的模型,导致model = create_model(a, b)得到的是None,无法进行后续预测。在函数末尾添加return model即可。数据未归一化(关键原因)
输入a的范围是1-99,输出b的最大值接近10000,数值跨度极大,神经网络难以处理这种尺度的输入输出,会导致梯度更新异常,Loss无法下降。必须先对数据做归一化处理:# 归一化输入到[0,1]区间 a_normalized = (a - tf.reduce_min(a)) / (tf.reduce_max(a) - tf.reduce_min(a)) # 归一化输出到[0,1]区间 b_normalized = (b - tf.reduce_min(b)) / (tf.reduce_max(b) - tf.reduce_min(b))训练时使用归一化后的
a_normalized和b_normalized,预测时需要对输入做相同归一化,再将预测结果反归一化还原:# 反归一化工具函数 def denormalize(pred, original_data): min_val = tf.reduce_min(original_data) max_val = tf.reduce_max(original_data) return pred * (max_val - min_val) + min_val简化模型结构
预测二次函数不需要复杂的多层网络,过度复杂的结构反而容易引发梯度消失。推荐简化为:model = tf.keras.Sequential([ tf.keras.layers.Dense(8, input_shape=[1], activation="relu"), tf.keras.layers.Dense(1) ])优化训练策略
- 调整学习率:默认Adam的学习率0.001可能偏大,尝试降低到0.0001:
opt = tf.keras.optimizers.Adam(learning_rate=0.0001) - 添加早停机制:避免无效训练,当Loss连续多轮不再下降时自动停止:
early_stop = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=30) model.fit(x, y, epochs=2000, verbose=2, callbacks=[early_stop])
- 调整学习率:默认Adam的学习率0.001可能偏大,尝试降低到0.0001:
修改后的完整代码示例:
import tensorflow as tf # 生成数据 a = tf.range(1, 100, dtype=float) r = tf.random.uniform(shape=a.shape) / 10 b = tf.square(a) + r # 数据归一化 a_normalized = (a - tf.reduce_min(a)) / (tf.reduce_max(a) - tf.reduce_min(a)) b_normalized = (b - tf.reduce_min(b)) / (tf.reduce_max(b) - tf.reduce_min(b)) # 反归一化工具函数 def denormalize(pred, original_data): min_val = tf.reduce_min(original_data) max_val = tf.reduce_max(original_data) return pred * (max_val - min_val) + min_val def create_model(x, y): opt = tf.keras.optimizers.Adam(learning_rate=0.0001) ls = "mean_squared_error" model = tf.keras.Sequential([ tf.keras.layers.Dense(8, input_shape=[1], activation="relu"), tf.keras.layers.Dense(1) ]) model.compile(optimizer=opt, loss=ls) early_stop = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=30) model.fit(x, y, epochs=2000, verbose=2, callbacks=[early_stop]) return model model = create_model(a_normalized, b_normalized) # 测试预测 test_a = tf.constant([50.0]) test_a_normalized = (test_a - tf.reduce_min(a)) / (tf.reduce_max(a) - tf.reduce_min(a)) pred_normalized = model.predict(test_a_normalized, verbose=0) pred = denormalize(pred_normalized, b) print(f"输入50的预测值:{pred[0][0]:.2f}, 真实值:{50**2:.2f}")
内容的提问来源于stack exchange,提问作者hy oy
相关产品推荐
相关产品推荐

