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