2016-02-22 3 views
3

Скажем, у меня есть два тензора в тензорном потоке, причем первое измерение представляет собой индекс примера обучения в партии, а остальные представляют собой некоторые векторы матриц данных. Напримерумножение матричной матрицы с тензорным потоком

vector_batch = tf.ones([64, 50]) 
matrix_batch = tf.ones([64, 50, 50]) 

Мне любопытно, что наиболее идиоматических способ для выполнения вектор * матрицы умножения, для каждой из пар векторов, матриц, которые разделяют индекс вдоль первого измерения.

Аки наиболее идиоматический способ написать:

result = tf.empty([64,50]) 
for i in range(64): 
    result[i,:] = tf.matmul(vector_batch[i,:], matrix_batch[i,:,:]) 

Что бы быть лучшим способом организовать форму входных векторов, чтобы сделать этот процесс максимально простым/чистым, насколько это возможно?

ответ

6

Вероятно, наиболее идиоматических способ сделать это с помощью tf.batch_matmul() оператора (в сочетании с tf.expand_dims() и tf.squeeze():

vector_batch = tf.placeholder(tf.float32, shape=[64, 50]) 
matrix_batch = tf.placeholder(tf.float32, shape=[64, 50, 50]) 

vector_batch_as_matrices = tf.expand_dims(vector_batch, 1) 
# vector_batch_as_matrices.get_shape() ==> [64, 1, 50] 

result = tf.batch_matmul(vector_batch_as_matrices, matrix_batch) 
# result.get_shape() ==> [64, 1, 50] 

result = tf.squeeze(result, [1]) 
# result.get_shape() ==> [64, 50] 
+0

Это именно то, что я искал, спасибо – Taaam

+1

Хмм 'tf.batch_matmul' не существуют в tf 1 - что будет эквивалентным кодом? plain matmul? –

Смежные вопросы