model.fit()永无止境或向我展示损失

时间:2019-07-09 02:21:48

标签: p5.js tensorflow.js

我正在尝试训练模型,并且从不通过fit()

在控制台中未显示丢失结果,它卡在那里。

已经将异步更改为一个承诺,但这是相同的。

要查看完整的代码,请单击here

function train() {
  trainModel().then(result => {
    console.log(result.history.loss[0]);
    setTimeout(train, 100);
  });
}

// entrena modelo〜params = train_xs(输入)y train_ys(输出)

async function trainModel() {

  //Create the input data

     for (let i = 0; i < 5; i++) {
        train_xs = tf.tensor2d(ins.pixels[i], [28, 28], 'int32');
        train_ys = tf.tensor2d(outs.coords[i], [3, 2], 'int32');

        const h = await model.fit(train_xs, train_ys, {
         epochs: 1

        });
        console.log("Loss after Epoch " + i + " : " + h.history.loss[0]);
      }
      console.log('end fitness model');
    }

//从不显示最终健身模型

没有错误消息,控制台保持简洁

1 个答案:

答案 0 :(得分:0)

有两个问题(控制台很干净,因为它没有注销错误):

  • xs和ys的形状与model.ins.pixels[i]

  • 的输入和输出不匹配
  • xs和ys的批次大小应相同。由于在for循环的所有迭代中,仅使用一个功能和一个标签,因此batchsize为1。

这是模型的修正

let model;

let xs;
let train_xs;
let train_ys; 
let inAndOut;

let resolution = 20;
let cols;
let rows;

var ins;
var outs;


function setup() {
  createCanvas(400, 400);
  /// visualization

  ins = new Inputs13(); // ins.pixels;
  outs = new Outputs13(); // outs.coords;
  inAndOut = new InputsAndOutputsToTest();



  ///crear modelo
  model = tf.sequential();

  let hidden = tf.layers.dense({
    inputShape: [784],
    units: 28,
    activation: 'sigmoid'
  });

  let output = tf.layers.dense({
    units: 6,
    activation: 'sigmoid'
  });

  model.add(hidden);
  model.add(output);

  const optimizer = tf.train.adam(0.1);
  model.compile({
    optimizer: optimizer,
    loss: 'meanSquaredError'
  })

  xs = tf.tensor2d(inAndOut.pixelsToTest[0],[28,28]);
  //console.log('xs');
  //console.log(xs);
  //xs.print();
  //entrena modelo
  setTimeout(train, 10);
}


//promesa, llama a entrenar modelo y muestra de losss
function train() {
  console.log("im in train!");
  trainModel().then(result => {
    console.log(result.history.loss[0]);
    setTimeout(train, 100);
  });

}

// entrena modelo~ params = train_xs(input) y train_ys(output)
async function trainModel() {
  let h;
    //Create the input data
  for (let i = 0; i < 5; i++) {
   train_xs = tf.tensor(ins.pixels[i], [1, 784]); //[tens], [shape]
   console.log('xs.shape', train_xs.shape)
   train_ys = tf.tensor(outs.coords[i]).reshape([1, 6]);
   console.log('ys.shape', train_ys.shape)
 /* console.log('train_xs');
   train_xs.print();
  console.log("train_ys");
  train_ys.print();*/

   h = await model.fit(train_xs, train_ys, {
   // shuffle: true,
    epochs: 1

  });
   console.log("Loss after Epoch " + i + " : " + h.history.loss[0]);
 }
  console.log('end fitness model');
  return h;
}


//muestra visual!
function draw() {
  background(220);

  //Get the predictions params xs = inputs para pruebas
  tf.tidy(() => {
    let ys = model.predict(xs);
    //console.log("ys");
    //console.log(ys);

    let y_values = ys.dataSync();
   //  console.log("y_values");
   // console.log(y_values);

  });

}

但是,可以同时使用所有13个功能和13个标签。 for循环将不再有用。

   train_xs = tf.tensor(ins.pixels, [13, 784]);
   console.log('xs.shape', train_xs.shape)
   train_ys = tf.tensor(outs.coords).reshape([13, 6]);