2015-06-28 41 views
1

我正在尝试使用numpy和cudamat进行相同的矩阵乘法。在与numpy和cudamat的矩阵乘法中有非常不同的结果

结果完全不同。

我在做什么错?

我使用:

  • 的Ubuntu 14.04
  • CUDA 7.0-28
  • NVIDIA 346.46
  • numpy的1.9.2
  • 的Python 2.7.10
  • 蟒蛇2.2.0 (64位)
  • cudamat(最新发布于2015年6月26日)
  • Nvidia的750Ti

而这是代码:

import numpy as np 
import cudamat as cm 
cm.init() 

... 

def distance(self, X): 
     gpu_W = cm.CUDAMatrix(self.W) 
     gpu_X = cm.CUDAMatrix(X) 
     gpu_X2 = cm.pow(gpu_X, 2).sum(axis=1) 
     gpu_W2 = cm.pow(gpu_W, 2).sum(axis=1) 
     prodWX = cm.dot(gpu_W, gpu_X.T) 
     prodWX = prodWX.mult((-2)) 

     W=self.W 
     prodWXgpu=prodWX.asarray() 
     prodWXcpu=-2*np.dot(W, X.T) 

cm.shutdown() 

的结果是:

enter image description here

两者都是二维阵列。它们的形状是:

W(14,2) X(10000,2)

这意味着2个乘法以及每个细胞的加成。 所以它不应该是由于累积性错误

在此先感谢

回答

0

我发现这个问题:cm.pow被修改收到的参数矩阵。

为了解决这个问题,我改变了:

gpu_X2 = cm.pow(gpu_X, 2).sum(axis=1) 
gpu_W2 = cm.pow(gpu_W, 2).sum(axis=1) 

由:

gpu_X2 = cm.empty (X.shape) 
gpu_W2 = cm.empty (W.shape) 

cm.pow(gpu_X, 2, target=gpu_X2) 
gpu_X2 = gpu_X2.sum(axis=1) 
cm.pow(gpu_W, 2, target=gpu_W2) 
gpu_W2 = gpu_W2.sum(axis=1)