张量流逐元素矩阵乘法
tensorflow element-wise matrix multiplication
假设我在 tensorflow 中有两个张量,第一个维度代表批次中训练示例的索引,其他维度代表数据矩阵的一些向量。例如
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,:,:])
组织输入向量的形状以使此过程尽可能 simple/clean 的最佳方法是什么?
可能最惯用的方法是使用 tf.batch_matmul()
operator (in conjunction with tf.expand_dims()
and 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]
看来 tf.matmul 已经支持这种类型的“nd”操作:
假设我在 tensorflow 中有两个张量,第一个维度代表批次中训练示例的索引,其他维度代表数据矩阵的一些向量。例如
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,:,:])
组织输入向量的形状以使此过程尽可能 simple/clean 的最佳方法是什么?
可能最惯用的方法是使用 tf.batch_matmul()
operator (in conjunction with tf.expand_dims()
and 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]
看来 tf.matmul 已经支持这种类型的“nd”操作: