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

为何TensorFlow无法从自定义numpy数组学习却适配硬编码数组?(三次回归)

问题分析:大数值数据集导致模型训练异常的原因及解决办法

问题描述

我用以下代码生成数据集:

x = []
for i in range(-500, 500):
  x.append(i)

y = []
for i in range(-500, 500):
  y.append(i**3)

x = np.array(x)
y = np.array(y)

用这个数据训练Keras模型时:

# Build model
model = tf.keras.Sequential([
    tf.keras.layers.Dense(4, activation="relu", input_shape = [1]),
    tf.keras.layers.Dense(16, activation="relu"),
    tf.keras.layers.Dense(1)
])

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=1e-1),
    loss='mean_squared_error',
    metrics=['mean_squared_error']
)

model.fit(x, y, epochs=1000)

得到的训练结果异常,损失值极高:

Epoch 1000/1000
32/32 [==============================] - 0s 2ms/step - loss: 646000595173376.0000 - mean_squared_error: 646000595173376.0000

但改用小尺度的硬编码数据集时,模型能得到极低的损失值,训练正常。

问题根源

  1. 数据尺度差异悬殊:第一个数据集的x范围是-500到499,y值最大可达125000000,而第二个数据集x仅在-5到5之间,y最大值仅14。神经网络对大数值极其敏感,MSE损失会因大误差直接爆炸,优化器完全无法收敛。
  2. 学习率与数据尺度不匹配:设置的1e-1学习率对小尺度数据可能合适,但面对百万级的y值,这么大的学习率会导致参数更新幅度过大,模型在最优解附近剧烈震荡甚至发散。
  3. ReLU激活的负区间失效:ReLU对负数输入会直接输出0,当x是-500这类大负数时,第一层网络的输出全被置0,后续层无法学习到负数区域的特征,导致模型对负区间的预测完全错误,进一步推高损失。

解决办法

  • 强制进行数据归一化/标准化:将x和y缩放到小范围(比如[-1,1]或均值为0、方差为1),这是神经网络训练的必备步骤。示例代码:
from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 初始化缩放器
scaler_x = MinMaxScaler(feature_range=(-1, 1))
scaler_y = MinMaxScaler(feature_range=(-1, 1))

# 对数据进行缩放(注意要转成二维数组)
x_scaled = scaler_x.fit_transform(x.reshape(-1, 1))
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1))

# 用缩放后的数据训练模型
model.fit(x_scaled, y_scaled, epochs=1000)

# 预测时需要反缩放得到真实值
y_pred = scaler_y.inverse_transform(model.predict(x_scaled))
  • 降低学习率:将学习率调整到1e-4或1e-5,让优化器能平稳更新参数,避免因步长过大导致发散。
  • 替换激活函数(可选):如果需要保留负数区域的特征,可以用LeakyReLU代替ReLU,避免负区间输入被完全丢弃:
tf.keras.layers.Dense(4, activation=tf.keras.layers.LeakyReLU(alpha=0.1), input_shape=[1])

内容的提问来源于stack exchange,提问作者jack the ripper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:24:08