3

我一直试图弄清楚如何使用 tensorflowJS 以异步方式执行预测。我所有的尝试都导致 predict 函数阻塞了我的代码。

查看文档,我看到大多数函数都被定义为异步函数并返回一个类似的承诺,例如tf.loadLayersModel,这也适用于我的异步,没有任何阻塞。

然而,predict不会返回一个 promise,而是直接返回一个tf.Tensor. 我尝试将预测包装在自定义定义的异步函数中,例如:

compute = async(data) => {
  var tensor = tf.tensor(data, [1, 100])
  var prediction = this.model.predict(tensor)
  return prediction.data()
}

但仍然 predict 阻止了我的代码的执行。

使用 TensorflowJS 进行异步推理的正确方法是什么?

4

2 回答 2

0

像这样扭曲你的代码(基于承诺):

const compute = (data) => {

    try {
        const tensor = tf.tensor(data, [1, 100])
        const prediction = this.model.predict(tensor)
        return Promise.resolve(prediction.data())
    }
    catch(err){

        return Promise.reject(err)

    }

  }

之后 :

compute.then(res => consonle.log(res)).catch(err => console.log(err));
于 2019-05-24T10:34:59.847 回答
0

问题是您不能将阻塞操作包装在 Promise 中,因为这不仅仅是它的工作方式。请参阅这个虚构的示例(这基本上就是您正在做的事情):

const blockFunction = () => {
  const endBlock = Date.now() + 2000
  while(Date.now() < endBlock){}
}

const promisedBlocking = () => new Promise((res, rej) => {
  const endBlock = Date.now() + 2000

  while (Date.now() < endBlock) {}
  return res('I cannot resolve before the blocking IO')
})

console.log('before blocking')
blockFunction()
console.log('after blocking')


console.log('before promised blocking')
promisedBlocking()
.then(console.log)
console.log('after promised blocking')

如果您将 tensorflow 与 node 一起使用,您可以将函数调用包装在一个单独的文件中并使用子进程调用它(参见fork方法),或者如果您在浏览器中使用 TF,则使用WebWorkers执行后台函数

于 2019-05-24T10:30:35.530 回答