Tensorflow.js请确保使用变量的操作在函数f内传递给minimize()

问题描述 投票:1回答:2

我已经开始使用javascript和TensorFlow.js来处理一些机器学习项目,我正在创建一个线性回归模型,但是,我无法弄清楚是什么导致了这个错误

无法找到任何变量与损失函数y = f(x)的结果之间的连接。请确保使用变量的操作在传递给minimize()的函数f中。“

我创建了两个Tensors

globalTensorXs = tf.tensor2d(globaArrayXs); //input data
globalTensorYs =  tf.tensor1d(globaArrayYs); //y output

我已经将系数/权重创建为如下tf标量数组。

function createWeights(_numWeights)
{       
  for ( var x = 0; x < _numWeights; x++)
  {
  globalWeightsTensorArr.push(tf.variable(tf.scalar(Math.random())));  
 }      
} 

有一个训练函数,我将x和y传递到,它是对optimise.minimize的调用导致问题。它不会检测训练变量,它存储在globalWeightsTensorArr中

async function train(xsTensor, ysTensor, numIterations)
{

    /*//////OPTIMISER.MINIMISE/////////////
    Minimize takes a function that does two things:
    It predicts y values for all the x values using the predict 
    model function. 
    It returns the mean squared error loss for those predictions 
    using the loss function. Minimize then automatically adjusts any 
    Variables used by thi predict/loss function in order to minimize 
    the return value (our loss), in this case the variables are in 
    "globalWeightsTensorArr" which contains the coefficient values 
     to be altered by the modeld during "numIterations" iterations of 
     SGD.
*/

  for (let iter = 0; iter < numIterations; iter++) 
  {     
      optimiser.minimize(function ()
      {
        return loss(predict(xsTensor), ysTensor);
       }, globalWeightsTensorArr);          
  }

}

//预测和损失函数在这里......

//以下代码构造一个预测函数,它接受输入(X's)//并返回预测Y:它代表我们的'模型'。给定输入//'xs',它将尝试*预测适当的输出'y'。

function predict(_Xs) 
{           
    return tf.tidy(() => {  
    for ( var x = 0; x < 8; x++)
        globalWeightsArr[x] = globalWeightsTensorArr[x].dataSync();
        const weightTensor =  tf.tensor1d(globalWeightsArr); 
        const prediction = tf.dot(_Xs, weightTensor);
        return prediction;
 });        
}

// loss函数从预测函数//和实际标签中获取预测并调整权重//权重被认为是影响//函数的任何张量变量我们可以在TensorFlow.js中定义MSE损失函数如下:

function loss(_predictedTensor, _labels) 
{
const meanSquareError =_predictedTensor.sub(_labels).square().mean();
return meanSquareError ;
}

有人可以帮忙解释一下这个问题吗?

关心艾迪恩

javascript tensorflow tensorflow.js
2个回答
1
投票

我们通过改变权重/系数的创建方式来解决问题。现在,最小化可以检测到预测使用的变量,并相应地调整它们。稍后我会将整个解决方案发布到codepen。还在学习!

function createWeights(_numWeights) {
    const randomTensor = tf.randomUniform([_numWeights, 1]);
    globalWeightsTensorVar = tf.variable(randomTensor);
}

这是使用的预测函数b

function predictLogical(_Xs) {

    return tf.dot(_Xs, globalWeightsTensorVar);
}

1
投票

这个问题与tf.variable有关。需要使用tf.variable来创建权重,这些权重将由optimiser.minimize()创建的函数更新。

tf.variable创建的变量是可变的,与tf.tensor相反,这是不可变的。因此,如果使用tf.tensor创建权重,则在训练期间无法更新

© www.soinside.com 2019 - 2024. All rights reserved.