Умножение N-D тензорной матрицы с тензорным потоком

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

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

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.]]]

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

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


person Mila    schedule 09.06.2018    source источник


Ответы (1)


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

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

Or,

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

eval это дает

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

       [[15., 22.],
        [43., 50.]]], dtype=float32)
person cs95    schedule 09.06.2018
comment
О, спасибо, такое простое решение. Я не смог вставить правую ось в tf.tensordot - person Mila; 09.06.2018