javascript - TensorflowJS 异步预测

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

查看 docs ,我看到大多数函数都被定义为异步函数并返回一个 promise ,例如 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()
}

但预测仍然阻止我的代码执行。

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

最佳答案

问题是您不能将阻塞操作包装在 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

https://stackoverflow.com/questions/56289685/

相关文章:

airflow - 无法在 GCP 上创建 Composer 环境

flutter - 如何在Flutter中真正使用SizeTransition?

unit-testing - 在作为 Prop 传递的函数上调用 Jest spyOn

django-rest-framework - 是否可以将搜索过滤器与查找表达式不是 `exact`

python - 在数据框中查找特定元素的列名

angular - 在 Azure 应用服务上部署多个 Angular 单页应用程序

c# - Mac OS 上的 unity 3d build 问题

c# - 使用 System.Print 在 "Microsoft Print to PDF"打印机

reactjs - 为什么脚本评估需要这么长时间?

vue.js - 如何使用 vue.js 和 element-ui 的文件上传组件在上传到服务器之前