在numpy和cudamat的矩阵乘法中有非常不同的结果

时间:2015-06-28 16:41:39

标签: python numpy matrix-multiplication

我正在尝试使用numpy和cudamat进行相同的矩阵乘法。

结果完全不同。

我做错了什么?

我正在使用:

  • Ubuntu 14.04
  • cuda 7.0-28
  • nvidia 346.46
  • numpy 1.9.2
  • Python 2.7.10
  • Anaconda 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)

它意味着每个单元格有两次乘法和加法。 所以它不应该是由于累积误差

提前致谢

1 个答案:

答案 0 :(得分: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)