Функция Матмуля для вектора с тензорным умножением в тензорном потоке
В общем, когда мы умножаем вектор v
измерения 1*n
с тензором T
измерения m*n*k
мы ожидаем получить матрицу / тензор размерности m*k
/m*1*k
, Это означает, что наш тензор имеет m
кусочки матриц с размерностью n*k
, а также v
умножается на каждую матрицу, и результирующие векторы складываются вместе. Для того, чтобы сделать это умножение в tensorflow
Я придумал следующую формулировку. Мне просто интересно, есть ли встроенная функция, которая делает это стандартное умножение простым?
T = tf.Variable(tf.random_normal((m,n,k)), name="tensor")
v = tf.Variable(tf.random_normal((1,n)), name="vector")
c = tf.stack([v,v]) # m times, here set m=2
output = tf.matmul(c,T)
2 ответа
Решение
Вы можете сделать это с:
tf.reduce_sum(tf.expand_dims(v,2)*T,1)
Код:
m, n, k = 2, 3, 4
T = tf.Variable(tf.random_normal((m,n,k)), name="tensor")
v = tf.Variable(tf.random_normal((1,n)), name="vector")
c = tf.stack([v,v]) # m times, here set m=2
out1 = tf.matmul(c,T)
out2 = tf.reduce_sum(tf.expand_dims(v,2)*T,1)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
n_out1 = sess.run(out1)
n_out2 = sess.run(out2)
#both n_out1 and n_out2 matches
Не уверен, что есть лучший способ, но похоже, что вы могли бы использовать tf.map_fn
как это:
output = tf.map_fn(lambda x: tf.matmul(v, x), T)