TensorflowJS прогнозируют асинхронно - PullRequest
1 голос
/ 24 мая 2019

Я пытался выяснить, как выполнять предсказания с использованием tenorflowJS в асинхронном режиме. Все мои попытки привели к тому, что функция предсказания блокировала мой код.

Глядя на документы , я вижу, что большинство функций определены как асинхронные функции и возвращают обещание, например, tf.loadLayersModel, которое также работает для меня асинхронно без какой-либо блокировки.

Однако предсказывает не возвращает обещание, а напрямую tf.Tensor. Я попытался обернуть предсказания в пользовательскую асинхронную функцию, например:

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

Но все же предсказание блокирует выполнение моего кода.

Как правильно использовать TensorflowJS для асинхронного вывода?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Введите ваш код следующим образом (на основе обещаний):

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));
0 голосов
/ 24 мая 2019

Проблема в том, что вы не можете заключить блокирующую операцию в обещание, потому что это не просто как она работает. Посмотрите на этот вымышленный пример (что, в основном, вы делаете):

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

Если вы используете тензор потока с узлом, вы можете заключить вызовы функций в отдельный файл и вызвать его с помощью дочернего процесса (см. Метод fork ), или если вы используете TF в браузер выполняет фоновую функцию, используя WebWorkers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...