TensorFlow训练X³+Y²拟合模型损失率过高求助
拟合X³+Y²模型损失过高的排查思路
核心问题与排查方向
模型结构无法捕捉非线性关系:你当前使用的是
Dense(1, input_shape=[2])的单层线性模型,它只能学习形如y = w1*x1 + w2*x2 + b的线性映射,但目标公式X³+Y²是非线性函数,线性模型完全没有能力拟合这种曲线关系,这是损失居高不下的根本原因。数据未做归一化处理:输入X的取值范围是1-12,但输出y的数值跨度极大(比如当X=[12,5]时y=1753,X=[1,3]时y=10)。这种数量级的差异会导致SGD优化器在更新权重时出现震荡,难以收敛到最优解,直接拖慢训练效率甚至导致损失无法下降。
模型容量不足:即使解决了归一化问题,单层模型的表达能力远远不够。需要引入带非线性激活函数的隐藏层,让模型具备学习复杂非线性映射的能力。比如添加使用ReLU激活的隐藏层,提升模型的容量。
优化器与训练参数设置:默认SGD的学习率可能不适合当前的数据尺度,建议换成Adam优化器(自适应学习率更稳定),同时可以根据训练情况调整epochs数量(比如增加到1000次)。
修正后的示例代码
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense import numpy as np from sklearn.preprocessing import MinMaxScaler # 准备数据集 X = np.array([ [2, 4], [5, 6], [7, 8], [9, 1], [2, 2], [3, 5], [6, 7], [8, 9], [10, 2], [1, 3], [4, 6], [5, 9], [7, 3], [8, 4], [9, 7], [10, 10], [11, 2], [3, 7], [6, 4], [12, 5] ], dtype=float) y = np.array([x[0]**3 + x[1]**2 for x in X], dtype=float) # 数据归一化,缩小输入输出的数值范围 scaler_X = MinMaxScaler() scaler_y = MinMaxScaler() X_scaled = scaler_X.fit_transform(X) y_scaled = scaler_y.fit_transform(y.reshape(-1, 1)) # 构建带非线性能力的模型 model = Sequential([ Dense(16, activation='relu', input_shape=[2]), Dense(8, activation='relu'), Dense(1) ]) # 使用Adam优化器,设置合适的学习率 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss="mean_squared_error") # 训练模型 model.fit(X_scaled, y_scaled, epochs=1000, verbose=1) # 测试并反归一化得到真实预测值 test_input = np.array([[2, 4]]) test_input_scaled = scaler_X.transform(test_input) pred_scaled = model.predict(test_input_scaled, verbose=0) pred = scaler_y.inverse_transform(pred_scaled) print(f"预测值:{pred[0][0]:.2f},真实值:24")
内容的提问来源于stack exchange,提问作者john doe
相关产品推荐
相关产品推荐

