当前位置: 首页 > 知识库问答 >
问题:

如何在nodejs(TensorFlow.js)中训练一个模型?

经嘉
2023-03-14

我想做一个图像分类器,但是我不懂Python。js与我熟悉的javascript一起工作。模型可以用它来训练吗?这样做的步骤是什么?坦白地说,我不知道从哪里开始。

const tf = require('@tensorflow/tfjs'),
      mobilenet = require('@tensorflow-models/mobilenet'),
      tfnode = require('@tensorflow/tfjs-node'),
      fs = require('fs-extra');

const imageBuffer = await fs.readFile(......),
      tfimage = tfnode.node.decodeImage(imageBuffer),
      mobilenetModel = await mobilenet.load();  

const results = await mobilenetModel.classify(tfimage);

=========================================

说我有一堆图像和标签。我如何使用它们来训练一个模型?

const myData = JSON.parse(await fs.readFile('files.json'));

for(const data of myData){
  const image = await fs.readFile(data.imagePath),
        labels = data.labels;

  // how to train, where to pass image and labels ?

}

共有1个答案

梁丘飞鸾
2023-03-14

首先,需要将图像转换为张量。第一种方法是创建一个包含所有特征的张量(分别是包含所有标签的张量)。只有在数据集包含的图像很少的情况下,才应该这样做。

  const imageBuffer = await fs.readFile(feature_file);
  tensorFeature = tfnode.node.decodeImage(imageBuffer) // create a tensor for the image

  // create an array of all the features
  // by iterating over all the images
  tensorFeatures = tf.stack([tensorFeature, tensorFeature2, tensorFeature3])

标签将是一个数组,指示每个图像的类型

 labelArray = [0, 1, 2] // maybe 0 for dog, 1 for cat and 2 for birds

现在需要创建标签的热编码

 tensorLabels = tf.oneHot(tf.tensor1d(labelArray, 'int32'), 3);

一旦有了张量,就需要创建用于训练的模型。这里有一个简单的模型。

const model = tf.sequential();
model.add(tf.layers.conv2d({
  inputShape: [height, width, numberOfChannels], // numberOfChannels = 3 for colorful images and one otherwise
  filters: 32,
  kernelSize: 3,
  activation: 'relu',
}));
model.add(tf.layers.flatten()),
model.add(tf.layers.dense({units: 3, activation: 'softmax'}));

然后对模型进行训练

model.fit(tensorFeatures, tensorLabels)

如果数据集包含大量图像,则需要创建tfDataset。这个答案讨论了为什么。

const genFeatureTensor = image => {
      const imageBuffer = await fs.readFile(feature_file);
      return tfnode.node.decodeImage(imageBuffer)
}

const labelArray = indice => Array.from({length: numberOfClasses}, (_, k) => k === indice ? 1 : 0)

function* dataGenerator() {
  const numElements = numberOfImages;
  let index = 0;
  while (index < numFeatures) {
    const feature = genFeatureTensor(imagePath) ;
    const label = tf.tensor1d(labelArray(classImageIndex))
    index++;
    yield {xs: feature, ys: label};
  }
}

const ds = tf.data.generator(dataGenerator);

并使用model.fitDataSet(ds)来训练模型

以上是在NodeJS中进行训练的内容。要在浏览器中进行这样的处理,genFeatureTensor可以编写如下:

function load(url){
  return new Promise((resolve, reject) => {
    const im = new Image()
        im.crossOrigin = 'anonymous'
        im.src = 'url'
        im.onload = () => {
          resolve(im)
        }
   })
}

genFeatureTensor = image => {
  const img = await loadImage(image);
  return tf.browser.fromPixels(image);
}

需要注意的是,执行大量处理可能会阻塞浏览器中的主线程。这就是web工作者发挥作用的地方。

 类似资料:
  • 我正在尝试训练名称查找器模型来检测名称,但它没有给出正确的结果。这是代码。 这是iam得到的输出: 检测到的名称:[07-20 19:35:47.516 8799:8799 I/Adreno EGL] en-ner-person.train内容是: 请帮忙。

  • 我有一个多类数据集,正在尝试使用对每个类进行分类。 因此,我想知道如何在每个类上训练<code>OneClassSVM()

  • 如何保存已训练的模型? 以后如何还原此保存的模型?

  • 在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰

  • 在之前的描述中,我们通常把机器学习模型和训练算法当作黑箱子来处理。如果你实践过前几章的一些示例,你惊奇的发现你可以优化回归系统,改进数字图像的分类器,你甚至可以零基础搭建一个垃圾邮件的分类器,但是你却对它们内部的工作流程一无所知。事实上,许多场合你都不需要知道这些黑箱子的内部有什么,干了什么。 然而,如果你对其内部的工作流程有一定了解的话,当面对一个机器学习任务时候,这些理论可以帮助你快速的找到恰

  • 我刚开始使用OpenNLP。我需要创建一个简单的训练模型来识别名称实体。