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

TensorFlow.js自定义回归模型无输出无报错问题排查

自定义回归模型无输出问题排查与修复

可能存在的代码问题

  • 输入值为0导致NaN:当xs等于0时,tf.scalar(305).div(xs)会触发除以0,得到无穷大值,后续log()运算会产生NaN,最终整个ys数组全部变为NaN,模型无法生成有效输出。
  • 数值稳定性差:
    • 若xs远大于305,305/xs趋近于0,ln(305/xs)会变成绝对值很大的负数,平方后数值暴增,容易引发梯度爆炸,导致权重更新异常,模型无法收敛。
    • 若xs接近305,ln(305/xs)趋近于0,这部分特征的贡献几乎可以忽略,模型难以学习到有效参数。
  • 权重初始化不当:新增参数e若使用默认初始化值(可能过大或过小),会导致输出值超出可视化范围,看起来像没有曲线。
  • 重复计算冗余:代码中重复计算xs.div(tf.scalar(305))和tf.scalar(305).div(xs).log(),虽不影响功能,但增加不必要的计算开销,也容易在修改时出错。

修复建议

  1. 处理输入边界,避免除以0:给xs添加极小的偏移量,防止出现0值:
const safeXs = xs.add(tf.scalar(1e-8)); // 避免xs为0
const xsOver305 = safeXs.div(tf.scalar(305));
const logRatio = tf.scalar(305).div(safeXs).log();
  1. 特征归一化,提升稳定性:将特征缩放到合理范围(如[-1,1]),避免数值波动过大:
// 对xs/305做归一化
const normalizedXsOver305 = xsOver305.sub(tf.scalar(0.5)).mul(tf.scalar(2));
// 对ln(305/xs)做归一化(假设其范围大致在-5到5)
const normalizedLogRatio = logRatio.div(tf.scalar(5));

// 替换原计算逻辑
const ys = a
  .add(normalizedXsOver305.mul(b))
  .add(normalizedXsOver305.square().mul(c))
  .add(normalizedLogRatio.mul(d))
  .add(normalizedLogRatio.square().mul(e));
  1. 优化权重初始化:手动给所有参数设置较小的随机初始值,避免输出异常:
const a = tf.variable(tf.scalar(Math.random() * 0.1));
const b = tf.variable(tf.scalar(Math.random() * 0.1));
const c = tf.variable(tf.scalar(Math.random() * 0.1));
const d = tf.variable(tf.scalar(Math.random() * 0.1));
const e = tf.variable(tf.scalar(Math.random() * 0.1));
  1. 缓存重复计算结果:减少冗余计算,提升代码可读性:
const safeXs = xs.add(tf.scalar(1e-8));
const xsOver305 = safeXs.div(tf.scalar(305));
const logRatio = tf.scalar(305).div(safeXs).log();

const ys = a
  .add(xsOver305.mul(b))
  .add(xsOver305.square().mul(c))
  .add(logRatio.mul(d))
  .add(logRatio.square().mul(e));

内容的提问来源于stack exchange,提问作者Fahmi Sabila Dinnulhaq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:30:00