如何使用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。
2条答案
按热度按时间6jjcrrmo1#
这不是一个广播问题。
b
是普通的JavaScript数组。在这种情况下,它是一个Tensor数组。要在dot
或matMul
运算中使用B,b需要是Tensor。但在这里情况并非如此。对于matMul
运算,给定两个Tensorx (shape [p,q])
,y (shape [r, s])
,q应该等于r。这是矩阵乘法的定义,即在tensorflow.js或tensorflow.py中没有matMul的brodcasting。点的操作非常相似。唯一的区别是一个操作数可以是矩阵,第二个操作数可以是向量。考虑以下情况:为了简单起见,括号中的是该形状的Tensor。
因为4和5(即为什么要做矩阵的平方有时被定义为矩阵和它的转置之间的乘积。对于给定的矩阵A,A*A不能总是被计算,除非A是方阵)
要计算B和a的乘积,您需要迭代b并执行matMul操作。
ikfrs5lh2#
这是题外话,但可以用mathjs来完成: