javascript 如何在tensorflow.js中广播矩阵/向量点积

vsmadaxz  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(119)

如何使用Javascript在Tensorflow中广播矩阵A与多个向量的乘法?让我们定义A:

A = tf.tensor2d([1, 0, 0, 2], [2, 2])
A.print()
Tensor
    [[1, 0],
     [0, 2]]

让我们将B向量定义为列向量(矩阵):

b = Array.apply({}, new Array(10)).map(_ => tf.tensor2d([[Math.floor(Math.random() * 100)], [Math.floor(Math.random() * 100)]]));
b[0].print()
Tensor
    [[90 ],
     [122]]

.matMul

A.matMul(b)
tfjs@latest:2 Uncaught Error: Error in matMul: inputs must have the same rank of at least 2, got ranks 2 and 1.

.dot

A.dot(b)
tfjs@latest:2 Uncaught Error: Error in dot: inner dimensions of inputs must match, but got 2 and 10

还尝试将B作为常规1dTensor:

b = Array.apply({}, new Array(10)).map(_ => tf.tensor1d([Math.floor(Math.random() * 100), Math.floor(Math.random() * 100)]));

结果是一样的。此外,从文件上看,这些操作似乎是不可广播的。我不明白为什么他们不能像numpy那样广播他们。
我看到了一些关于python的相同问题的答案,建议使用einsum。但它似乎只适用于python,而不是javascript。

6jjcrrmo

6jjcrrmo1#

这不是一个广播问题。b是普通的JavaScript数组。在这种情况下,它是一个Tensor数组。要在dotmatMul运算中使用B,b需要是Tensor。但在这里情况并非如此。对于matMul运算,给定两个Tensorx (shape [p,q])y (shape [r, s]),q应该等于r。这是矩阵乘法的定义,即在tensorflow.js或tensorflow.py中没有matMul的brodcasting。点的操作非常相似。唯一的区别是一个操作数可以是矩阵,第二个操作数可以是向量。
考虑以下情况:为了简单起见,括号中的是该形状的Tensor。

[4, 5].matMul([5, 6]) = [4, 5].dot([5, 4]) => [4, 6]
[4, 5].matMul([4, 5]) => error

因为4和5(即为什么要做矩阵的平方有时被定义为矩阵和它的转置之间的乘积。对于给定的矩阵A,A*A不能总是被计算,除非A是方阵)

[5].dot([5, 4]) => [4]
[5, 4].dot([4]) => [5, 1]
[5].dot([4, 5]) => error
[5, 4].dot([5]) => error

要计算B和a的乘积,您需要迭代b并执行matMul操作。

a = tf.tensor2d([1, 0, 0, 2], [2, 2])

// there is much simpler way to create an array of 10 tensors without apply function
const b = Array.from({length:10}, _ => tf.tensor2d([[Math.floor(Math.random() * 100)], [Math.floor(Math.random() * 100)]]))
// Matmul operation
const prod = b.map(t => a.matMul(t))
prod.forEach(t => t.print())
<html>
  <head>
    <!-- Load TensorFlow.js -->
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"> </script>
  </head>

  <body>
  </body>
</html>
ikfrs5lh

ikfrs5lh2#

这是题外话,但可以用mathjs来完成:

A = [[1, 0],
     [0, 2]]

B = [[90],
     [122]]

tf.matMul(A, B)
math.multiply(A, B)

相关问题