将结果放入变量

Getting the result into a variable

我有以下示例代码。我能够从打印功能的控制台中看到正确的结果。

  // Define a model for linear regression.
  const model = tf.sequential();
  model.add(tf.layers.dense({units: 1, inputShape: [1]}));
  model.add(tf.layers.dense({units: 4, inputShape: [1]}));
  model.add(tf.layers.dense({units: 10, inputShape: [1]}));

  model.add(tf.layers.dense({units: 1, inputShape: [1]}));  

  // Prepare the model for training: Specify the loss and the optimizer.
  model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

  // Generate some synthetic data for training.
  const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
  const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

  // Train the model using the data.
  model.fit(xs, ys).then(() => {
    // Use the model to do inference on a data point the model hasn't seen before:
    // Open the browser devtools to see the output
    answer = model.predict(tf.tensor2d([3], [1, 1]));
    answer.print()

  });

我想做的是将答案放入数字变量中,以便我可以在其他地方使用它。我得到的答案是:

Tensor [[4.9999123],]

但我想将 4.9999 放入一个变量中,以便我可以将它四舍五入为 5 并将其打印在屏幕上(在 html 中)。

我发现答案是:

    answer.data().then((d)=>{
      console.log(d[0])
    })

answer 有一个 returns 承诺的数据方法。您可以从承诺中获取数据。

我搜索了 Whosebug,这让我想到了这个问题: Get data from 2D tensor with tensorflow js

Rocksetta 在以下网站上向他们的代码发布了 link:

https://hpssjellis.github.io/beginner-tensorflowjs-examples-in-javascript/beginner-examples/tfjs02-basics.html

最简单的方法是使用answer.dataSync(),但是会阻塞主线程。如果您对 async / await 感到满意,answer.data() 就是解决方案。

有时

The easiest way is to use answer.dataSync(), but it will block the main thread. If you are comfortable with async / await, answer.data() is the solution.

工作正常,但其他时候

answer.dataSync()

returns 一个数组。当面对数组时,你需要尝试

answer.dataSync()[0]

或其他一些数组编号。

同样的问题
await answer.data()[0]

要将Tensor的值转化为普通的JavaScript变量,可以使用TensorflowJs的两个内置函数:一个是同步的dataSync() and the other is asynchronous data().

dataSync() will block the UI thread. So whenever possible the asynchronous data()应该是首选。

const x = tf.tensor1d([45, 48]);
x.print();
/* Async way */
(async () => {
  const val = await x.data()
   // get the first element
  console.log(val[0])
})()
/* Sync way */
const val = x.dataSync()[0]
console.log(val)
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/0.12.4/tf.js"> </script>
  </head>

  <body>
  </body>
</html>

这是我最喜欢的方式:

var answerdata = await answer.data()
var answerArray = Array.from(answerdata);

answerArray 会被压平,但它又快又简单。如果您正在加载 Keras 模型或执行各种其他异步操作,您通常会使用异步函数。