【问题标题】:TensorflowJS predict asynchronouslyTensorflowJS 异步预测
【发布时间】:2019-05-24 09:29:24
【问题描述】:

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

查看docs,我看到大多数函数都定义为异步函数并返回一个promise,例如tf.loadLayersModel,它也对我异步工作,没有任何阻塞。

但是,predict 不返回承诺,而是直接返回 tf.Tensor。我尝试将预测包装在自定义定义的异步函数中,例如:

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

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

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

【问题讨论】:

标签: javascript tensorflow async-await tensorflowjs-converter


【解决方案1】:

问题是您不能将阻塞操作包装在 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,您可以将函数调用包装在一个单独的文件中并使用子进程调用它(请参阅fork 方法),或者如果您在浏览器中使用 TF,则执行后台函数使用WebWorkers

【讨论】:

    【解决方案2】:

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

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2021-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多