Тензор потока Эйнсум против Матмула против Тензордо
В тензорном потоке функции 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 с меньшим количеством операций, и, следовательно, затраты на вызовы для каждой операции будут ниже.