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

TensorFlow入门示例扩展训练数据后输出NaN问题求助

问题根源与解决办法

1. 张量形状不匹配

原代码中xs和ys都是2D张量(形状[6,1],代表6个样本,每个样本1个特征),但你的修改版用tf.tensor(d)生成的是1D张量,模型输入层定义为inputShape: [1],要求输入必须是2D格式(每个样本是长度为1的向量),形状不匹配会导致训练计算出错,最终输出NaN。

2. 数据范围过大引发梯度爆炸

新数据的x范围是-50到9,数值远大于原示例的-1到4,而SGD优化器默认学习率(0.01)在处理大数值时,容易出现梯度更新幅度过大,导致权重变成NaN。


修改后的正确代码

async function run() {
  // Create a simple model.
  const model = tf.sequential();
  model.add(tf.layers.dense({units: 1, inputShape: [1]}));

  // 适当降低学习率,适配大数值范围
  model.compile({loss: 'meanSquaredError', optimizer: tf.train.sgd(0.001)});

  // Generate some synthetic data for training. (y = 2x - 1)
  const d = [];
  const r = [];
  for (let x = -50; x < 10; x++) {
    const y = x * 2 - 1;
    d.push(x);
    r.push(y);
  }
  // 保持2D张量形状,和原代码格式一致
  const xs = tf.tensor2d(d, [d.length, 1]);
  const ys = tf.tensor2d(r, [r.length, 1]);

  // Train the model using the data.
  await model.fit(xs, ys, {epochs: 250});

  // Use the model to do inference on a data point the model hasn't seen.
  // Should print approximately 39.
  document.getElementById('micro-out-div').innerText =
      model.predict(tf.tensor2d([20], [1, 1])).dataSync();
}

run();

额外优化建议

  • 如果不想调整学习率,也可以对输入数据做归一化处理(比如把x缩放到-1到1之间),同样能避免梯度爆炸问题。
  • 这类简单线性模型不需要盲目增加训练轮次,250轮已经足够,过多轮次反而可能在大学习率下导致震荡发散。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:02:32