python - skcuda linalg 中的 "unsupported combination of input order"

标签 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 的数组没有正确的维度,则会引发类似的错误。不过,我对此进行了测试,并没有发现任何问题。 事实上,解决这个问题的补丁相当奇怪。对两个数组进行切片后,我只需将它们保存到文件中,然后将它们加载回来。然后这个错误就不会出现。

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

最佳答案

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

如果您将 numpy 数组传递给 GPU,则可以在传递它之前更改其连续性

x = numpy.ascontiguousarray(x)

对于 C 连续性,或

x = numpy.asfortranarray(x)

fortran 连续性。我不知道数组在 GPU 上后是否有任何方法可以更改数组的连续性,但我假设 pycuda.gpyarray 模块中有适当的方法。

关于python - skcuda linalg 中的 "unsupported combination of input order",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48637274/

相关文章:

Python多功能多线程与threading.Thread? (线程数可变)

python - Django 模板 : How to display block of HTML based on a boolean field in model

python - 对象生成器模式

python - python实现鼠标画圆圈的方法

python - 查找各个序列的 R2 和斜率

Python Scipy 指数曲线拟合

Python 从类中获取值

python - Scipy odeint 给出 lsoda 警告

python - 获取数组,它是对对象数组的每个元素调用函数的结果

python - 使用 scipy.io.savemat 将 python 变量保存到 .mat 文件