【问题标题】:How to get data from 2D tensor?如何从二维张量中获取数据?
【发布时间】:2018-04-04 08:32:33
【问题描述】:

我想用tensorflow.js 从二维张量中获取数据。我尝试像这样使用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]

有没有办法保持数组的形状?

【问题讨论】:

    标签: javascript tensorflow.js


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      为了速度,张量中的数据总是以扁平的形式存储为一维数组。

      您给出的示例不起作用,因为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,我如何才能只获得一列张量?
      • 猜你需要检查.shape[x,y],然后只从你的数组中获取y元素,如果你想要第二列那么它的skip y, take y(不是实际的JS代码)跨度>
      • 是的,我最终使用张量的形状对data() 返回的数组进行切片。只是想知道是否有办法保持形状(比如tensor2d.data() 返回的数组数组)。
      • 我喜欢 await data() 因为你通常在异步函数中加载模型
      • 很遗憾,这并不能回答问题。
      【解决方案3】:

      我使用函数在网页中显示二维张量

      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 表格,问题是保持张量的形状
      • 感谢您的回答。您的代码实际上帮助我解决了我的另一个问题:stackoverflow.com/questions/50000400/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2020-05-11
      • 2021-11-03
      • 1970-01-01
      • 2013-12-26
      • 2022-09-29
      • 1970-01-01
      相关资源
      最近更新 更多