【问题标题】:Matrix multiplication in tensorflow张量流中的矩阵乘法
【发布时间】:2023-03-20 23:39:02
【问题描述】:

我有五个矩阵 300*300 我有 1380 个大小为 [300] 的向量 我将这些定义为变量

S1= tf.get_variable('S1',dtype=tf.float32, shape=[5,300,300],initializer=tf.random_uniform_initializer(maxval=0.1, minval=-0.1))
E1=tf.get_variable('E1',dtype=tf.float32, shape=[1380,300], initializer=tf.random_uniform_initializer(maxval=0.1, minval=-0.1))

我想要的是将五个矩阵中的每一个与每个向量相乘,并对每个矩阵的结果求和

我试过下面的代码但是效率不高,而且我需要重复这个操作超过17000次(batch_size=50),所以效率对我来说真的很重要。

w_ist = tf.reshape(tf.tile(E1, [batch_size*5,300]), [batch_size, 5, 1380, 300]) 

R_t = tf.transpose(tf.reshape(tf.tile(S1, [batch_size*1380,300,300]), [batch_size,1380,5,300,300]), perm=[0,2,1,3,4]) 
dot_1 = tf.matmul(R_t, tf.expand_dims(w_ist,axis=4)) #because R is 5 dim and w_istt is 4 dim we need to expand it by repeating axis number4 

有什么有效的方法吗??

【问题讨论】:

  • tf.reduce_sum(S1[:,tf.newaxis,:,:]*E1[:, :,tf.newaxis], [1,2,3])

标签: python tensorflow


【解决方案1】:

我不确定tf.einsum 的效率,但我相信它可以用于此目的。看起来它会比这更有效,但不一定是最佳解决方案。像tf.einsum('ijk,lk->ilj', S1, E1) 这样的东西应该完成乘法,最终张量的形状为(5, 1380, 300),或者你可以直接使用tf.einsum('ijk,lk->i', S1, E1),据我所知,这将沿着最后两个轴求和(如果我正确理解你的问题) ((5,) 的最终形状)。

【讨论】:

  • 谢谢,它正在工作,我将测量复杂性并查看
猜你喜欢
  • 2018-05-24
  • 2018-11-19
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2017-06-07
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多