如何获得张量的元素i,j的值

时间:2018-08-14 19:15:52

标签: tensorflow.js

我有一个2d张量,我想获取索引i,j值的元素的值。

2 个答案:

答案 0 :(得分:2)

有很多方法可以检索张量2d的元素[i,j]的值

请考虑以下内容:

使用slice直接从尺寸为[1,1]的坐标[i,j]开始检索tensor2d

h.slice([i, j], 1).as1D().print()

使用gather获取行i作为张量2d,然后使用slice获取元素j

h.gather(tf.tensor1d([i], 'int32')).slice([0, j], [1, 1]).as1D().print()

使用stack检索第i行作为tensor1d,使用slice检索所需的元素

h.unstack()[i].slice([j], [1]).print()

const h = tf.tensor2d([45, 48, 45, 54, 5, 7, 8, 10, 54], [3, 3]);
// get the element of index [1, 2]
h.print()
h.gather(tf.tensor1d([1], 'int32')).slice([0, 2], [1, 1]).as1D().print()
h.slice([1, 2], 1).as1D().print()
h.unstack()[1].slice([2], [1]).print()
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script>
  </head>

  <body>
  </body>
</html>

如果目标是获取元素[i,j]以便在其他张量计算中使用它,例如将矩阵除以元素,则需要将元素转换为标量。

h.slice([i, j], 1).as1D().asScalar()

如果您想将该值返回给javascript变量(类型编号),则需要dataSync()data(),如本answer

中所述
h.slice([i, j], 1).as1D().dataSync()[0]
// or
const data = await h.slice([i, j], 1).as1D().data()

const h = tf.tensor2d([45, 48, 45, 54, 5, 7, 8, 10, 54], [3, 3]);
// get the element of index [1, 2]
h.print()
// sync method
const val = h.unstack()[1].slice([2], [1]).dataSync()
console.log(val[0]);
// async method
(async () => {
  const val = await h.slice([1, 2], 1).as1D().data()
  console.log(val[0])
})()
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tensorflow/0.12.4/tf.js"> </script>
  </head>

  <body>
  </body>
</html>

答案 1 :(得分:1)

您可以使用.dataSync()或等待.data()来检索包含张量的所有值的一维数组。

现在我们只需要使用以下公式从2d坐标中计算1d索引:

  

索引=行长*行号+列号

以下代码显示了如何使用每个版本。

注意异步方法中的asyncawaitasync使函数异步,因此我们可以使用await等待另一个诺言来解决(.data()兑现了承诺)。因为异步函数返回了一个Promise,所以我们必须等待它,然后才能使用.then()

对其进行记录

function getValSync(t, i, j) {
  const data = t.dataSync();
  return data[t.shape[0] * j + i]; //Or *i+j, depending on what the dimension order is
}

async function getValAsync(t, i, j) {
  const data = await t.data();
  return data[t.shape[0] * j + i];
}

const t2d = tf.tensor2d([1, 2, 3, 4], [2, 2]);

t2d.print();

console.log("1,0:", getValSync(t2d, 1, 0));
console.log("1,1:", getValSync(t2d, 1, 1));

getValAsync(t2d, 0, 0).then(v => console.log("0,0:", v));
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0">
</script>