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

TensorFlow训练二次函数预测模型时Loss停滞问题求助

解决TensorFlow训练二次函数预测模型Loss停滞的问题

核心问题与修复步骤:

  1. 模型未返回
    你的create_model函数没有返回训练后的模型,导致model = create_model(a, b)得到的是None,无法进行后续预测。在函数末尾添加return model即可。

  2. 数据未归一化(关键原因)
    输入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
    
  3. 简化模型结构
    预测二次函数不需要复杂的多层网络,过度复杂的结构反而容易引发梯度消失。推荐简化为:

    model = tf.keras.Sequential([
        tf.keras.layers.Dense(8, input_shape=[1], activation="relu"),
        tf.keras.layers.Dense(1)
    ])
    
  4. 优化训练策略

    • 调整学习率:默认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])
      

修改后的完整代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:05:19