如何从二维张量中获取数据?

6

我希望能够使用tensorflow.js从2D张量中获取数据。我尝试使用以下代码来使用data()方法:

const X = tf.tensor2d([[1, 2, 3, 4], [2, 2, 5, 3]]);
X.data().then(X => console.log(X)};

但结果是一个扁平的一维数组:
Float32Array(8) [1, 2, 3, 4, 2, 2, 5, 3]

有没有一种方法可以保持数组的形状?
3个回答

2
您可以在张量对象上使用arraySync方法。它会同步地返回与原始形状相同的数组。

const X = tf.tensor2d([[1, 2, 3, 4], [2, 2, 5, 3]]); 
console.log(X.arraySync())
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.2.7/dist/tf.min.js"></script>


0

在 Tensor 中,数据总是以类型为一维数组的方式存储,以提高速度。

你给出的例子不会起作用,因为 tensor2d 的第二个参数是 shape。要使其起作用,你需要将其包装在另一个数组中:

const x = tf.tensor2d([[1, 2, 3, 4], [2, 2, 5, 3]]); //shape inferred as [2, 4]

或者你可以明确地提供形状:

const x = tf.tensor2d([1, 2, 3, 4, 2, 2, 5, 3], [2, 4]); // shape explicitly passed

就像你建议的一样,当你检查数据时,你总是会得到一个一维数组,无论原始形状如何。

await x.data() // Float32Array(8) [1, 2, 3, 4, 2, 2, 5, 3]
x.shape // [2, 4]

然而,如果您将张量打印出来print(),形状会被考虑在内,并显示为:

Tensor
    [[1, 2, 3, 4],
     [2, 2, 5, 3]]

谢谢你的回答。那是个笔误:我实际上使用了 tf.tensor2d([[1, 2, 3, 4], [2, 2, 5, 3]]);。但是,由于 x.data() 返回一个平坦的 Float32Array,我该如何获取张量中的一列呢? - hhh
我猜你需要检查 .shape [x,y],然后只从你的数组中取 y 个元素,如果你想要第二列,那么就是 跳过 y,取 y(不是实际的 JS 代码)。 - dark_ruby
是的,我最终使用张量的形状来切片data()返回的数组。只是想知道是否有一种方法可以保留形状(就像通过tensor2d.data()返回的数组的数组一样)。 - hhh
我喜欢使用 await data(),因为通常你已经在异步函数中了,以加载模型。 - Ben Gubler
很遗憾,这并没有回答问题。 - Cyril

0
我使用一个函数在网页中显示2D张量。
async function myTensorTable(myDiv, myOutTensor, myCols, myTitle){   

 document.getElementById(myDiv).innerHTML += myTitle + '<br>'
 const myOutput = await myOutTensor.data()
 myTemp = '<table border=3><tr>'
   for (myCount = 0;    myCount <= myOutTensor.size - 1;   myCount++){   
     myTemp += '<td>'+ myOutput[myCount] + '</td>'
     if (myCount % myCols == myCols-1){
         myTemp += '</tr><tr>'
     }
   }   
   myTemp += '</tr></table>'
   document.getElementById(myDiv).innerHTML += myTemp + '<br>'
}

使用示例在

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


我认为OP并不是在询问如何构建HTML表格,问题是如何保持张量的形状。 - dark_ruby
谢谢你的回答。你的代码实际上帮助了我解决了我的另一个问题:https://dev59.com/_arka4cB1Zd3GeqPkNz5#50000585 - K-Dawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接