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

如何用深度学习拟合指数形式数据?模型损失过高问题求解

问题分析与解决方案

核心问题拆解

  1. 输出层激活函数错误:你用了sigmoid作为输出层激活,它的输出范围是0-1,但你的标签Y范围是3到800,模型根本无法输出匹配的数值,这是损失居高不下的核心原因。
  2. 特征未做归一化:X是1992-2023的年份数据,数值过大,会导致神经网络权重更新时梯度异常,难以收敛。
  3. 错误使用分类指标:accuracy是分类任务的评价指标,回归任务中用它完全没有意义,显示0是正常现象,无需关注。

修正步骤与代码

1. 数据预处理

对特征X做归一化缩小数值范围,同时对指数衰减的Y做对数转换,将指数关系转为线性关系,让模型更容易拟合:

# 调用深度学习所需的Keras函数
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 导入所需库
import numpy as np
import tensorflow as tf

# 设置随机种子以保证每次运行结果一致
np.random.seed(3)
tf.random.set_seed(3)

# 导入准备好的数据集
Data_set = np.loadtxt("size.csv", delimiter = ",")

# 将数据分为特征X和标签Y
X = Data_set[:,0]
Y = Data_set[:,1]

# 数据预处理:X归一化到0-1区间
X = (X - X.min()) / (X.max() - X.min())
# 对Y取对数,将指数关系转为线性关系
Y_log = np.log(Y)

2. 调整模型结构

移除输出层的sigmoid激活,回归任务输出层默认使用线性激活(无需额外指定):

# 构建模型
model = Sequential()
model.add(Dense(30, input_dim=1, activation='relu'))
model.add(Dense(1))  # 输出层无激活,默认线性激活

# 编译模型:移除accuracy指标,只保留MSE损失
model.compile(loss='mean_squared_error', optimizer='adam')

# 训练模型,适当增加epochs
history = model.fit(X, Y_log, epochs=500, batch_size=4)

3. 预测与还原结果

训练完成后,对预测结果做指数反变换,还原为原始数据范围:

# 预测并还原
Y_pred_log = model.predict(X)
Y_pred = np.exp(Y_pred_log)

# 打印对比结果
print("真实值:", Y)
print("预测值:", Y_pred.flatten())

额外说明

  • 如果不想对Y做对数转换,也可以对Y做归一化(比如Y = (Y - Y.min())/(Y.max()-Y.min())),但指数数据用对数转换的拟合效果通常更好。
  • 若训练时收敛仍慢,可以尝试微调Adam优化器的学习率(比如optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)),或者调整隐藏层的神经元数量。

内容的提问来源于stack exchange,提问作者박영준

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:12:35