skcuda linalg中的“不支持的输入顺序组合”

时间:2018-02-06 07:05:56

标签: python scipy

我在python中使用手动实现的神经网络。 我使用两个numpy数组X和X_test作为测试样本的向量。一个是培训,另一个是测试集。

当我通过我所拥有的一系列功能传递这些功能时,一切都运行得很好,我得到了我想要的任何结果。 但是,当我将这些向量切片为仅包含我确定与输出相关的列(或输入要素)时,我收到以下错误:

File "/storage/home/abhirathb/BNN/src/Layer.py", line 498, in updateOutputs
  self.outputs = linalg.dot(inputs,self.weights)
File "/home/abhirathb/anaconda2/lib/python2.7/site-packages/skcuda/linalg.py", line 634, in dot
  return add_dot(x_gpu, y_gpu, out, transa, transb, 1.0, 0.0, handle)
File "/home/abhirathb/anaconda2/lib/python2.7/site-packages/skcuda/linalg.py", line 465, in add_dot
  raise ValueError('unsupported combination of input order')
ValueError: unsupported combination of input order

如果提供给linalg.dot的数组没有正确的维度,则会抛出类似的错误。但是,我已经对此进行了测试,并且没有发现任何错误。 事实上,用于解决此问题的补丁相当奇怪。切片两个数组后,我只是将它们保存到文件中,然后加载它们。然后这个错误没有显示出来。

我无法弄清楚原因可能是什么以及为什么这个补丁会起作用。 希望有人能指出我正确的方向

2 个答案:

答案 0 :(得分:1)

请注意,当您使用numpy转置函数时,numpy.ndarray对象从C连续(默认情况下)变为fortran连续(反之亦然)。我怀疑错误源于连续性问题,因为1)GPUArray对象的基本方法经常抛出与连续性有关的错误,2)skcuda.linalg函数似乎传递了一个错误,就像你在传递转置时所描述的那样数组到gpu并尝试对它进行操作。

如果您将numpy数组传递给gpu,则可以在使用

传递之前更改其连续性
x = numpy.ascontiguousarray(x)

表示C邻接,或

x = numpy.asfortranarray(x)

for fortran contiguity。我不知道是否有任何方法可以在GPU上更改阵列的连续性,但我认为pycuda.gpyarray模块中有适当的方法。

答案 1 :(得分:0)

以下代码重现该错误:

import pycuda.autoinit
import pycuda.gpuarray as gpuarray
import numpy as np
import skcuda.linalg as linalg
import skcuda.misc as misc
linalg.init()
a = np.asarray(np.random.rand(4, 2), np.float32)
b = a.transpose()
a_gpu = gpuarray.to_gpu(a)
b_gpu = gpuarray.to_gpu(b)
c_gpu = linalg.dot(a_gpu, b_gpu)
np.allclose(np.dot(a, b), c_gpu.get())

如@ z-cris在帖子中所述,可以通过使用

来避免错误
b = a.transpose()
b = np.ascontiguousarray(b)