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

TensorFlow.js六参数多元函数拟合报错及参数求解咨询

问题修正与非线性回归实现方案

错误原因分析

  1. API已废弃:tf.train.minimize是TensorFlow.js旧版本的API,当前最新版本已移除,需使用具体优化器(如Adam、SGD)的实例方法。
  2. 变量管理错误:每次调用Ulberg都重新创建参数变量,导致优化器无法持续跟踪参数的更新状态。
  3. 梯度追踪破坏:使用arraySync()将张量转为普通数组计算损失,丢失了TF.js自动微分所需的张量操作记录,无法计算参数梯度。
  4. 输入数据结构不合理:x1和x2作为独立张量传入,不符合批量数据处理的规范,也不利于后续扩展更大的数据集。

修正后的完整代码

<html>
  <head>
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@latest/dist/tf.min.js"></script>
  </head>
  <body>
    <h4>Tensorflow.js 非线性参数拟合<hr/></h4>
    <script>
      // 1. 准备数据集:替换为你的Vrev、I、T真实数据
      // 示例:假设x1=T, x2=Vrev, y=I
      const xData = tf.tensor2d([
        [10, 8],   // [T1, Vrev1]
        [11, 21],  // [T2, Vrev2]
        [12, 4]    // [T3, Vrev3]
      ]);
      const yData = tf.tensor2d([8, 21, 4], [3, 1]); // 对应I值

      // 2. 初始化可训练参数变量(6个待求解参数)
      const r1 = tf.variable(tf.scalar(1.0));
      const r2 = tf.variable(tf.scalar(1.0));
      const s = tf.variable(tf.scalar(1.0));
      const t1 = tf.variable(tf.scalar(1.0));
      const t2 = tf.variable(tf.scalar(1.0));
      const t3 = tf.variable(tf.scalar(1.0));
      const Vrev = tf.scalar(1.0); // 若Vrev是数据集的一部分,需改为张量并参与计算
      const A = tf.scalar(1.0);

      // 3. 定义预测函数:实现你的R²→R映射逻辑
      function predict(x) {
        // 拆分输入张量的x1(T)和x2(Vrev)
        const x1 = x.slice([0, 0], [-1, 1]);
        const x2 = x.slice([0, 1], [-1, 1]);

        const Blocco1 = tf.div(Vrev, A);
        const Blocco2 = tf.add(r1, tf.mul(r2, x2));
        const Blocco3 = tf.mul(tf.mul(Blocco1, Blocco2), x1); // 原代码此处参数错误,修正为连续mul
        const Blocco4 = tf.mul(Blocco3, s);
        const Blocco5 = tf.div(t2, x1);
        const Blocco6 = tf.div(t3, tf.pow(x1, 2));
        const Blocco7 = tf.add(t1, Blocco5);
        const Blocco8 = tf.add(Blocco7, Blocco6);
        const Blocco9 = tf.log(tf.add(Blocco8, 1));
        return tf.add(Blocco4, Blocco9);
      }

      // 4. 定义损失函数:均方误差
      function loss() {
        const yPred = predict(xData);
        return tf.losses.meanSquaredError(yData, yPred);
      }

      // 5. 选择优化器:使用Adam优化器,可调整学习率
      const optimizer = tf.train.adam(0.01);

      // 6. 训练循环:迭代优化参数
      async function train(numIterations) {
        for (let i = 0; i < numIterations; i++) {
          optimizer.minimize(loss);
          
          // 每100次迭代打印一次损失,监控训练进度
          if (i % 100 === 0) {
            const currentLoss = loss().dataSync()[0];
            console.log(`迭代次数 ${i}: 损失值 = ${currentLoss.toFixed(6)}`);
          }
          
          // 释放张量内存,避免内存泄漏
          await tf.nextFrame();
        }

        // 训练完成后输出最优参数
        console.log("优化后的参数:");
        console.log(`r1: ${r1.dataSync()[0].toFixed(6)}`);
        console.log(`r2: ${r2.dataSync()[0].toFixed(6)}`);
        console.log(`s: ${s.dataSync()[0].toFixed(6)}`);
        console.log(`t1: ${t1.dataSync()[0].toFixed(6)}`);
        console.log(`t2: ${t2.dataSync()[0].toFixed(6)}`);
        console.log(`t3: ${t3.dataSync()[0].toFixed(6)}`);
      }

      // 启动训练:根据数据集大小调整迭代次数
      train(1000);
    </script>
  </body>
</html>

关键修正点说明

  • 参数变量全局化:将6个待优化参数定义为全局变量,确保优化器能持续跟踪其梯度并更新。
  • 优化器替换:使用tf.train.adam()创建Adam优化器实例,调用其minimize方法来最小化损失函数,这是TF.js当前的标准用法。
  • 张量操作保留:损失计算全程基于张量,没有使用arraySync(),保证自动微分能正确计算参数梯度。
  • 输入合并:将x1和x2合并为一个二维张量,方便后续扩展更大的数据集,也符合TF.js的数据处理规范。
  • 训练循环:通过多次迭代训练,逐步降低损失,同时加入损失监控和内存释放逻辑,避免内存泄漏。

适配真实数据集的方法

  1. 将xData替换为你的真实数据:每一行对应一组[T, Vrev],行数等于数据样本数。
  2. 将yData替换为对应的I值,保持样本数量与xData一致。
  3. 如果Vrev是随样本变化的变量(而非固定值1.0),需将其作为xData的一部分传入,或调整predict函数的逻辑,将Vrev作为输入张量处理。
  4. 根据训练过程中的损失下降情况,调整优化器的学习率(如0.0010.1之间)和迭代次数(如100010000次)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:02:34