2017-07-01 68 views
1

我想通過使用tf.matmul()執行稀疏矩陣乘法。如何使用tf.matmul執行高效的稀疏矩陣乘法?

然而,推理速度比密集矩陣乘法慢得多。

根據tf.sparse_matmul()的描述:

  • 使用該對緻密矩陣乘法在一個平臺上爲30%,在稀疏矩陣的零值的盈虧平衡。

因此,我就與7/8零值的稀疏矩陣。

這裏是我的代碼:

import tensorflow as tf 
import numpy as np 
import time 
a = tf.Variable(np.arange(1000).reshape(250,4) ,dtype=tf.float32) #dense matrix 
b = tf.Variable(np.array([0,0,0,0,0,0,0,1],dtype=np.float32).reshape(4,2),dtype=tf.float32) # sparse matrix 
c = tf.matmul(a,b,b_is_sparse=True) # do the sparse matrix multiplication 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    num_iteration = 5000 
    num_burnin = 50 
    duration = 0 

    for i in range(num_iteration+num_burnin): 
     startTime = time.time() 
     result = sess.run(c) 
     endTime = time.time() 
     if i > num_burnin : 
      duration+= endTime-startTime 

    print(" Average Inference Time = %.3f ms"%(duration*1000/num_iteration)) 

我設置「b_is_sparse =真」做一個稀疏矩陣乘法,它發生在我的GeForce GTX 960M約0.380毫秒。

但是,如果設置了「b_is_sparse =假」做一個密集的矩陣乘法,它需要大約0.280毫秒。

我試過使用tf.sparse_tensor_dense_matmul和tf.embedding_lookup_sparse來執行稀疏矩陣乘法,但推理速度仍然比密集矩陣乘法要慢。

在我的代碼或其他方式執行稀疏矩陣乘法有什麼問題嗎?

任何意見將不勝感激!

回答

2

相對性能取決於許多因素。稀疏乘法可能比密集矩陣密集乘法(希望)更快,但你說得對,它也可能更慢。

首先,它取決於矩陣的大小。

這裏是兩個方陣相乘的結果,一個隨機和一個填充了零的的一個,並記錄了密集和備用乘法的計算時間。

enter image description here

正如你可以看到,即使一個完全零矩陣,稀疏的乘法可以比密集的乘法小矩陣大小慢 - 事實上慢三倍約120x120矩陣。在我的計算機上的這個實驗中,稀疏矩陣乘法開始接管大小約爲700x700,結束速度快大約2倍。當然YMMV取決於你的配置。