Tensorflow.js Пожалуйста, убедитесь, что операции, которые используют переменные, находятся внутри функции f, переданной для минимизации ()

1

Я начал использовать javascript и TensorFlow.js для работы над некоторыми проектами машинного обучения, я работаю над созданием модели линейной регрессии, однако я не могу понять, что вызывает эту ошибку

Невозможно найти связь между любой переменной и результатом функции потерь y = f (x). Убедитесь, что операции, в которых используются переменные, находятся внутри функции f, переданной для минимизации(). "

Я создал два тензора

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, это призыв к оптимизации. 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;
 });        
}

//Функция потерь принимает предсказания из функции прогнозирования//и фактических таблиц и корректирует весовые коэффициенты//весы считаются любой тензорной переменной, воздействующей на//функцию. Мы можем определить функцию потери MSE в TensorFlow.js следующее:

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

кто-нибудь может помочь объяснить проблему?

С уважением, Айдеен

Теги:
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);
}
0

Проблема связана с tf.variable. Нужно использовать tf.variable для создания весов, которые будут обновляться функцией, созданной optimiser.minimize().

Переменная, созданная tf.variable вопреки tf.tensor которая является неизменной. В результате, если использовать tf.tenso r для создания весов, которые они не могли бы обновить во время обучения

  • 0
    Спасибо за ответ, да, я изначально создавал массив tf.tensor для хранения весов. теперь я использую const randomTensor = tf.randomUniform ([_ numWeights, 1]); globalWeightsTensorVar = tf.variable (randomTensor); однако теперь у меня, похоже, другая, но связанная с этим проблема. веса обновляются, если я использую mod = tf.matMul (_Xs, globalWeightsTensorVar); но как только я сделаю какой-либо расчет по моду, такой как предикат = tf.round (tf.sigmoid (мод)); веса перестают обновляться! Вы случайно не знаете почему?
  • 0
    Я решил проблему, о которой упомянул в комментарии, с помощью элементаpretion = tf.matMul (_Xs, globalWeightsTensorVar) .sigmoid (); хотя я до сих пор не понимаю, почему это работает против другого. Большое спасибо.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню