Представьте, что у меня есть набор векторов A
, и я хочу умножить каждый вектор в A
на тензор T
, чтобы наконец получить тензор y
, в котором каждая матрица срезов является результатом умножения вектора v
в A
на T
:
Если X
состоит только из одного вектора, то следующий код работает (благодаря ответу в функция Матмуля для вектора с тензорным умножением в тензорном потоке):
tf.reduce_sum(tf.expand_dims(v,2)*T,1)
Но если X
состоит из нескольких векторов, как будет код для умножения?
Например, у меня есть следующие значения для A
(с 2
векторами) и T
:
A = tf.constant([1,2,3,4], shape=[2,2], dtype=tf.float32) #v1 =[1,2], v2=[3,4]
T = tf.constant([1,2,3,4,5,6,7,8], shape=[2,2,2], dtype=tf.float32)
Я хочу получить следующий результат, умножив A
на T
:
[[[ 7. 10.]
[19. 22.]]
[[15. 22.]
[43. 50.]]]
Приложением к этому вопросу является пакетный градиентный спуск в линейной регрессии y = AX +b
, в котором у меня есть набор векторов, но вместо обучения весовой матрицы X
я хочу обучить тензор T
, поэтому результат y
будет тензором в каждая матрица тензора является результатом умножения входного вектора на T
.
Обратите внимание, что, как правило, когда мы умножаем вектор v
размерности 1*n
на тензор T
размерности m*n*k
, мы ожидаем получить матрицу / тензор размерности m*k/m*1*k
. Это означает, что наш тензор имеет m
срезов матриц с размерностью n*k
, а v
умножается на каждую матрицу, и полученные векторы складываются вместе.