Как я могу заставить этот базовый пример работать с TensorFlow.js обучение для вывода true / false с помощью tf.browser.fromPixels (изображение)?

#javascript #tensorflow #tensorflow.js

#javascript #tensorflow #tensorflow.js

Вопрос:

Я прогуглил все версии вопроса, которые мог придумать, но, хоть убейте, я не могу найти ни одного базового примера tensorflow.js обучение tf.browser.fromPixels (изображение) для получения результата «да» или «нет». Все примеры, которые я смог найти, начинаются с предварительно обученных сетей.

Я создал базу данных из изображений размером 25×25 пикселей и сохранил их все в виде холстов в переменной типа:

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

И я думаю, что должно быть тривиально сделать что-то вроде:

 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 и различные мелкие детали, будучи новыми для TF, делают попытку выполнить это без возможности найти базовый пример довольно болезненной кривой обучения. Как бы выглядело действительное представление этой функции обучения? Вот код на данный момент:

 // 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}
);  
 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>  

Ответ №1:

У вас есть только один слой для вашей модели. Вам нужно больше слоев, чем это. Существует множество руководств, которым вы можете следовать, чтобы создать классификатор для различения двух или более классов изображений. Вот это руководство на официальном веб-сайте tensorflow с использованием CNN.

Кроме того, вы можете увидеть, как использовать полностью подключенную нейронную сеть, используя этот фрагмент для построения классификатора, хотя точность может быть не такой хорошей, как у моделей CNN.