Pytorch - Портирование @ Оператор - PullRequest
1 голос
/ 05 февраля 2020

У меня есть следующая строка кода, которую я хочу перенести в Torm Matmul

rotMat = xmat @ ymat @ zmat

Могу ли я узнать, правильный ли это порядок:

rotMat = torch.matmul(xmat, torch.matmul(ymat, zmat))

1 Ответ

2 голосов
/ 05 февраля 2020

В соответствии с python документами о приоритете оператора, оператор @ имеет ассоциативность слева направо

https://docs.python.org/3/reference/expressions.html#operator -приоритет

Операторы в той же группе блоков слева направо (за исключением возведения в степень, которая группируется справа налево).

Поэтому эквивалентная операция

rotMat = torch.matmul(torch.matmul(xmat, ymat), zmat)

Хотя имейте в виду это умножение матриц ассоциативно (математически), поэтому вы не увидите большой разницы в результате, если вы сделаете это иначе. Как правило, вы хотите связать таким образом, чтобы получить наименьшее количество вычислительных шагов. Например, используя алгоритм умножения наивной матрицы, если X равен 1x10, Y равен 10x100, а Z равен 100x1000, тогда разница между

(X @ Y) @ Z

и

X @ (Y @ Z)

составляет около 1 * 10 * 100 + 1 * 100 * 1000 = 101 000 операций умножения / сложения для первой и 10 * 100 * 1000 + 1 * 10 * 1000 = 1 001 000 операций для второй. Хотя они имеют одинаковый результат (игнорируя ошибки округления), вторая версия будет примерно в 10 раз медленнее!


Как указывалось в @Szymon Maszke, тезоры pytorch также поддерживают оператор @, так что вы все еще можете используйте

xmat @ ymat @ zmat

в pytorch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...