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

神经网络无法拟合y=2x关系,训练异常求解决

解决神经网络无法拟合y=2x的问题

核心问题分析

  • 输出层激活函数错误:sigmoid激活函数的输出范围固定在(0,1),但你的y值范围是0到19998,完全超出这个区间,模型根本无法输出符合目标范围的值,这是预测结果固定在0.74左右的核心原因。
  • 数据未做归一化:x的取值从0到9999,y到19998,数值过大导致模型训练时梯度不稳定,loss值异常高且下降缓慢。
  • 模型结构冗余且不合理:拟合简单线性关系不需要多层带relu的隐藏层,relu的非线性特性反而会干扰线性拟合,甚至可能引发梯度消失问题。

修改后的代码

import tensorflow as tf
import numpy as np

# 生成数据并做归一化处理
x = np.arange(10000, dtype=np.float32)
y = x * 2.0

# 将数据归一化到0-1区间,解决数值过大的问题
x = x / np.max(x)
y = y / np.max(y)

# 简化模型结构,线性拟合无需复杂隐藏层
model = tf.keras.models.Sequential()
# 线性任务直接用单层Dense,无需激活函数
model.add(tf.keras.layers.Dense(1, input_shape=(1,)))

model.compile(loss='mse', optimizer='adam')
model.fit(x, y, epochs=50, batch_size=32)

# 预测时同步做归一化和结果还原
test_x = np.array([2.0], dtype=np.float32)
normalized_test_x = test_x / np.max(x)
predicted_normalized_y = model.predict(normalized_test_x)
predicted_y = predicted_normalized_y * np.max(y)
print(predicted_y)

关键修改说明

  • 移除输出层的sigmoid激活函数,线性回归任务需要线性输出,无需非线性激活限制范围。
  • 对输入x和目标y做归一化,将大数值压缩到0-1区间,解决训练时梯度不稳定的问题。
  • 简化模型结构,仅保留一个线性输出层即可拟合y=2x的关系;若需保留隐藏层,需去掉relu激活,改用线性激活(或不指定激活函数)。

内容的提问来源于stack exchange,提问作者Krishan _13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:02:39