ND тензорное матричное умножение с тензорным потоком - PullRequest
0 голосов
/ 09 июня 2018

Предположим, у меня есть набор векторов A, и я хочу умножить каждый вектор в A на тензор T, чтобы в итоге получить тензор y, в котором каждая матрица срезов является результатом умноженияvector v in A with T:

Если X состоит только из одного вектора, то работает следующий код (благодаря ответу в функции matmul для вектора с тензорным умножениемв тензорном потоке ):

tf.reduce_sum(tf.expand_dims(v,2)*T,1)

Но если X состоит из нескольких векторов, каким будет код для умножения?

Например, у меня есть следующие значения для A2 векторами) и 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.]]]

AnПриложением к этому вопросу является пакетный градиентный спуск в линейной регрессии y = AX +b, в котором у меня есть набор векторов, но вместо тренировки весовой матрицы X я хочу обучить тензор T, поэтому вывод y будет тензор, в котором EACМатрица h в тензоре - это результат умножения входного вектора на T.

. Обратите внимание, что, как правило, при умножении вектора v размерности 1*n на тензор Tразмерность m*n*k, мы ожидаем получить матрицу / тензор размерности m*k/m*1*k.Это означает, что наш тензор имеет m срезов матриц с размерностью n*k, и v умножается на каждую матрицу, и результирующие векторы складываются вместе.

1 Ответ

0 голосов
/ 09 июня 2018

Попробуйте tf.tensordot:

tf.tensordot(A, T, axes=[-1, -2])

Или

tf.squeeze(tf.tensordot(A[:, None], T, axes=[2, 1]))

eval, что дает

array([[[ 7., 10.],
        [19., 22.]],

       [[15., 22.],
        [43., 50.]]], dtype=float32)
...