Как транслировать матричный / векторный точечный ptoduct в tenorflow.js - PullRequest
0 голосов
/ 01 октября 2018

Как я могу транслировать умножение матрицы A с несколькими векторами в Tensorflow с Javascript?Давайте определим 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 в качестве обычного 1d тензора:

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

Результаты совпадают.Более того, глядя на документ, кажется, что эти операции не транслируются.Я не понимаю, почему они не могут быть такими, как numpy может их транслировать.

Я видел какой-то ответ на тот же вопрос для python, предлагающий использовать einsum.Но, похоже, он доступен только для Python, но не для JavaScript.

1 Ответ

0 голосов
/ 01 октября 2018

Это не проблема вещания.b - это обычный массив JavaScript.В этом случае это массив тензорных.Чтобы использовать b в операциях dot или matMul, b должен быть тензором.Это не тот случай, здесь.Для операции matMul, учитывая два тензора x (shape [p,q]), y (shape [r, s]), q должно быть равно r.Это само определение умножения матриц, т. Е. Для matMul нет широковещательной передачи ни в tenorflow.js, ни в tenorflow.py.Точечная операция очень похожа.Единственное отличие состоит в том, что один операнд может быть матрицей, а второй - вектором.

Обратите внимание на следующее: для простоты то, что в скобках, является тензором этой формы.

[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>
...