我一直在尝试找出如何以异步方式使用 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`
angular - 在 Azure 应用服务上部署多个 Angular 单页应用程序
c# - Mac OS 上的 unity 3d build 问题