如何使用tf.browser.fromPixels(image)获得TensorFlow.js训练的基本示例工作,以获取对/错输出?

时间:2019-03-28 17:46:50

标签: javascript tensorflow tensorflow.js

我已经用谷歌搜索了我能想到的每个问题的版本,但是对于我来说,我找不到一个通过tensorflow.js训练tf.browser.fromPixels(image)来得出肯定或不正确的基本示例。一个没有我能找到的所有示例都是从预训练的网开始的。

我建立了一个25x25像素图像的数据库,并将它们全部存储为画布,例如:

function onEdit(event) {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();


  if(s.getName() == "Terminations" && r.getColumn() == 1 && r.getValue() == "Completed") {
    event.range.getSheet().getRange(event.range.rowStart,3).setValue(Utilities.formatDate(new Date(), Session.getTimeZone(), "MM/dd/yyyy HH:mm:ss"));
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("Processed Terminations");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    s.deleteRow(row);
  }
}

我认为做这样的事情应该是微不足道的:

let data = {
    t: [canvas1, canvas2, canvas3, ... canvas3000 ....],
    f: [canvas1, canvas2, ... and so on ...]
}

但是TF的新细节(例如data.t.forEach(canvas => { const xs = tf.browser.fromPixels(canvas); const ys = tf.tensor([1]); // output 1, since this canvas is from the `t` (true) dataset model.fit(xs, ys, { batchSize: 1, epochs: 1000 }); }); data.f.forEach(canvas => { const xs = tf.browser.fromPixels(canvas); const ys = tf.tensor([0]); // output 0, since this canvas is from the `f` (false) dataset model.fit(xs, ys, { batchSize: 1, epochs: 1000 }); }); model.predict(tf.browser.fromPixels(data.t[0])).print(); // -> [1] model.predict(tf.browser.fromPixels(data.t[1])).print(); // -> [1] model.predict(tf.browser.fromPixels(data.t[2])).print(); // -> [1] model.predict(tf.browser.fromPixels(data.f[0])).print(); // -> [0] model.predict(tf.browser.fromPixels(data.f[1])).print(); // -> [0] model.predict(tf.browser.fromPixels(data.f[2])).print(); // -> [0] 和各种小细节)使得尝试实现这一点而又无法找到基本示例几乎是一个痛苦的学习过程。该培训函的有效表示是什么样子?到目前为止,这是代码:

inputShape
// Just imagine DataSet builds a large data set like described in my 
// question and calls a callpack function with the data variable as 
// its only argument, full of pre-categorized images. Since my database 
// of images is locally stored, I cant really produce an example here 
// that works fully, but this gets the idea across at least.
new DataSet(
  data => {
    
    const model = tf.sequential();
    
    model.add(
    
      // And yes, I realize I would want a convolutional layer, 
      // some max pooling, filtering, etc, but I'm trying to start simple
      
      tf.layers.dense({
        units: [1],
        inputShape: [25, 25, 3],
        dataFormat: "channelsLast",
        activation: "tanh"
      })
    );
    
    model.compile({optimizer: "sgd", loss: "binaryCrossentropy", lr: 0.1});
    
    data.t.forEach(canvas => {
        const xs = tf.browser.fromPixels(canvas);
        const ys = tf.tensor([1]); // output 1, since this canvas is 
        // from the `t` (true) dataset
        model.fit(xs, ys, {
          batchSize: 1,
          epochs: 1000
        });
    });
    
    data.f.forEach(canvas => {
        const xs = tf.browser.fromPixels(canvas);
        const ys = tf.tensor([0]); // output 0, since this canvas is 
        // from the `f` (false) dataset
        model.fit(xs, ys, {
          batchSize: 1,
          epochs: 1000
        });
    });
    
    model.predict(tf.browser.fromPixels(data.t[0])).print(); // -> [1]
    model.predict(tf.browser.fromPixels(data.t[1])).print(); // -> [1]
    model.predict(tf.browser.fromPixels(data.t[2])).print(); // -> [1]
    
    model.predict(tf.browser.fromPixels(data.f[0])).print(); // -> [0]
    model.predict(tf.browser.fromPixels(data.f[1])).print(); // -> [0]
    model.predict(tf.browser.fromPixels(data.f[2])).print(); // -> [0]
    
  },
  {canvas: true}
);

1 个答案:

答案 0 :(得分:0)

您的模型只有一层。您需要的层更多。 您可以遵循许多教程来构建分类器,以区分两个或更多类图像。 Here是使用CNN在tensorflow官方网站上的本教程。

此外,您可以看到如何使用this snippet来使用完全连接的神经网络来构建分类器,尽管准确性可能不如CNN模型。