使用tensorflow js从2D张量获取数据

时间:2018-04-04 08:32:33

标签: javascript tensorflow.js

我想从tensorflow.js的2D张量中获取数据。我尝试使用data()方法,如下所示:

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

但结果是一个扁平的1D阵列:

Float32Array(8) [1, 2, 3, 4, 2, 2, 5, 3]

有没有办法保持阵列的形状?

3 个答案:

答案 0 :(得分:0)

为了提高速度,Tensor中的数据总是被平铺为类型1维数组。

您提供的示例无效,因为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]]

答案 1 :(得分: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

答案 2 :(得分:0)

您可以在张量对象上使用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>