与 numpy 和 cudamat 的矩阵乘法有完全不同的结果
Having quite different results in matrix multiplication with numpy and cudamat
我正在尝试使用 numpy 和 cudamat 进行相同的矩阵乘法。
结果大相径庭
我做错了什么?
我正在使用:
- Ubuntu 14.04
- cuda 7.0-28
- 英伟达 346.46
- numpy 1.9.2
- Python 2.7.10
- 蟒蛇 2.2.0(64 位)
- cudamat(2015 年 6 月 26 日最新发布)
- 英伟达 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()
结果是:
都是二维数组。它们的形状是:
W (14,2)
X (10000, 2)
这意味着每个单元格有两次乘法和一次加法。
所以这不应该是由于累积误差
提前致谢
我发现了问题: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)
我正在尝试使用 numpy 和 cudamat 进行相同的矩阵乘法。
结果大相径庭
我做错了什么?
我正在使用:
- Ubuntu 14.04
- cuda 7.0-28
- 英伟达 346.46
- numpy 1.9.2
- Python 2.7.10
- 蟒蛇 2.2.0(64 位)
- cudamat(2015 年 6 月 26 日最新发布)
- 英伟达 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()
结果是:
都是二维数组。它们的形状是:
W (14,2) X (10000, 2)
这意味着每个单元格有两次乘法和一次加法。 所以这不应该是由于累积误差
提前致谢
我发现了问题: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)