Потеря tenorflow.js уходит в бесконечность - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь сделать простой проект, чтобы найти коэффициенты уравнения, используя модель tenorflow.js. однако при запуске потеря приближается к бесконечности и становится равной NaN примерно за 4 итерации. Я не знаю, почему это происходит. Вот мой код:

let xs = [];
let ys = [];

let aReal = Math.random();
let bReal = Math.random();
let cReal = Math.random();
let dReal = Math.random();

for (let i = -100; i < 100; i+=1) {
    xs.push(i);
    ys.push((aReal*Math.pow(i, 3) + bReal*Math.pow(i, 2) + cReal*i + dReal) + Math.random()*10-1);
}

const a = tf.variable(tf.scalar(Math.random()));
const b = tf.variable(tf.scalar(Math.random()));
const c = tf.variable(tf.scalar(Math.random()));
const d = tf.variable(tf.scalar(Math.random()));



function predict(x) {
  return tf.tidy(() => {
    return a.mul(x.pow(tf.scalar(3, 'int32')))
      .add(b.mul(x.square()))
      .add(c.mul(x))
      .add(d);
  });
}

function loss(predictions, labels) {
  const meanSquareError = predictions.sub(labels).square().mean();
  print(meanSquareError.dataSync());
  return meanSquareError;
}

function train(xS, yS, numIterations) {
  const learningRate = 0.1;
  const optimizer = tf.train.sgd(learningRate);

  console.log(xS.dataSync(), yS.dataSync());

  for (let iter = 0; iter < numIterations; iter++) {
    optimizer.minimize(() => {
      const predYs = predict(xS);
      return loss(predYs, yS);
    });

  }
}

train(tf.tensor(xs), tf.tensor(ys), 100);

let yPred = predict(tf.tensor(xs)).dataSync();

console.log(yPred);

let trace1 = {
    x: xs,
    y: ys,
    mode: 'markers',
    type: 'scatter'
};

let trace2 = {
  x: xs,
  y: yPred,
  mode: 'lines',
};

console.log(aReal, bReal, cReal, dReal);
console.log(a.dataSync(), b.dataSync(), c.dataSync(), d.dataSync());

let graphData = [trace1, trace2];

Plotly.newPlot('graph', graphData);

Plotly - это просто библиотека js, которую я использую для отображения данных.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы должны попытаться нормализовать свои входные данные, чтобы прогноз работал правильно. В противном случае оптимизация становится численно нестабильной.

ys = [...];
// compute mean and stdev for ys!
normalized = (ys-ysmean)/(ysstd);
train(xs, normalized);
normed_pred = predict(xs);
pred = ysstd*normed_pred+ysmean;

В тестах, которые я запускал, ваш код отлично работает на линейных моделях y=ax+b; поэтому мой вывод.

0 голосов
/ 06 мая 2018

Попробуйте понизить скорость обучения. Как только он станет стабильным, вы сможете настроить его обратно на скоростные тренировки. Если он слишком высокий, вы получите нестабильность и NaNs

const learningRate = 0.0001;

...