我一直在尝试弄清楚如何使用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进行异步推理的正确方法是什么?
发布于 2019-05-24 18:30:36
问题是您不能将阻塞操作包装在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-24 18:35:00
像这样保证你的代码(基于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));https://stackoverflow.com/questions/56289685
复制相似问题