Умножение тензоров с разными рангами

Я хотел бы перемножить два тензора с разными рангами, например

tensor A -> (i x j x k x l)
tensor B -> (l x m)

чтобы получить другой тензор с этой размерностью.

tensor C -> (i x j x k x m) = (i x j x k x l)*(l x m)

В тензорном потоке мне все время приходится менять форму, чтобы получить результат как

(A.reshape(-1,l)*B).reshape(i,j,k,m)

Любая другая операция, которая делает это напрямую?


person RobinHood    schedule 30.05.2017    source источник
comment
Вы пытаетесь умножить эти тензоры поэлементно или выполнить (пакетное) матричное умножение?   -  person mrry    schedule 05.06.2017
comment
Это матричное умножение, подобное этому (i x j x k x l) * (l x m) = (i x j x k x m). Возможно, это пакетное умножение матриц.   -  person RobinHood    schedule 06.06.2017
comment
Но тогда вам нужно использовать tf.matmul, а не *   -  person Patwie    schedule 19.09.2017
comment
tf.matmul дает ошибку ранга (Tensorflow 1.4). np.matmul, похоже, работает должным образом.   -  person Souradeep Nanda    schedule 26.11.2017
comment
используйте tf.tensordot: stackoverflow.com/questions/47969305   -  person Raphael Schumann    schedule 10.03.2018


Ответы (1)


Вам понадобится tf.tensordot. Изменять форму перед настоящим умножением не нужно. Если вы хотите сжать тензор A и B по последнему измерению A и первому измерению B, вы можете умножить тензор A и тензор B следующим образом:

tf.tensordot(A, B, axes=[[3], [0]])
person Yan    schedule 09.09.2018