Тензор потока Эйнсум против Матмула против Тензордо

В тензорном потоке функции tf.einsum, tf.matmul, а также tf.tensordot все могут быть использованы для тех же задач. (Я понимаю, что tf.einsum а также tf.tensordot иметь более общие определения; Я также понимаю, что tf.matmul имеет пакетную функциональность.) В ситуации, когда может быть использована любая из трех, одна из функций будет наиболее быстрой? Существуют ли другие правила рекомендации?

Например, предположим, что A тензор ранга 2 и b это тензор ранга 1, и вы хотите вычислить произведение c_j = A_ij b_j, Из трех вариантов:

c = tf.einsum('ij,j->i', A, b)

c = tf.matmul(A, tf.expand_dims(b,1))

c = tf.tensordot(A, b, 1)

любой вообще предпочтительнее других?

1 ответ

Решение

И то и другое tf.tensordot() а также tf.einsum() являются синтаксическим сахаром, который оборачивает один или несколько вызовов tf.matmul() (хотя в некоторых особых случаях tf.einsum() можно упростить до элементарной tf.multiply()).

В пределе я ожидаю, что все три функции будут иметь одинаковую производительность для одного и того же вычисления. Однако для более мелких матриц может быть более эффективно использовать tf.matmul() напрямую, поскольку это приведет к более простому графику TensorFlow с меньшим количеством операций, и, следовательно, затраты на вызовы для каждой операции будут ниже.

Другие вопросы по тегам