CuPy and Dirichlet gives me TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
CuPy and Dirichlet gives me TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
我只想创建一个随机矩阵 A,其向量取自 Dirichlet 分布。该函数适用于 numpy:
import numpy as np
A = np.random.dirichlet(np.ones(n), n)
当我用 cupy
做同样的事情时
import cupy as cp
A = cp.random.dirichlet(cp.ones(n), n)
我收到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-45a4f64a8b6e> in <module>
6 n = 10000 #Size of the square matrix
7
----> 8 A = cp.random.dirichlet(cp.ones(n), n)
9
10 print("--- %s seconds ---" % (time.time() - start_time))
~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_distributions.py in dirichlet(alpha, size, dtype)
112 """
113 rs = _generator.get_random_state()
--> 114 return rs.dirichlet(alpha, size, dtype)
115
116
~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_generator.py in dirichlet(self, alpha, size, dtype)
144 size = alpha.shape
145 else:
--> 146 size += alpha.shape
147 y = cupy.empty(shape=size, dtype=dtype)
148 _kernels.standard_gamma_kernel(alpha, self._rk_seed, y)
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
当输入是像这样的 numpy 数组时
import cupy as cp
import numpy as np
A = cp.random.dirichlet(np.ones(n), n)
然后我得到同样的错误。
146行的alpha.shape
是我手动检查的(n,)。这是一个 cupy bug 还是我遗漏了什么?
我正在为 CUDA 10.1 使用 cupy-cuda101 版本 8.5.0。与 cupy 和 tensorflow 有关的所有其他内容在我的 GPU (2080ti) 上都能完美运行。
这是 cupy 中的一个错误,您应该在他们的 GitHub 上报告它。
尽管有文档,但它们没有正确处理整数参数的情况。他们要求您提供元组或 None
。这就是为什么你会看到你所看到的行为。 (如果你提供了一个元组 (a, b)
,那么最终的形状应该是 (a, b, n)
.
此处的解决方法是提供您想要的形状作为长度为 1 的元组:(n,)
。注意逗号是必须的。
我只想创建一个随机矩阵 A,其向量取自 Dirichlet 分布。该函数适用于 numpy:
import numpy as np
A = np.random.dirichlet(np.ones(n), n)
当我用 cupy
做同样的事情时import cupy as cp
A = cp.random.dirichlet(cp.ones(n), n)
我收到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-1-45a4f64a8b6e> in <module>
6 n = 10000 #Size of the square matrix
7
----> 8 A = cp.random.dirichlet(cp.ones(n), n)
9
10 print("--- %s seconds ---" % (time.time() - start_time))
~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_distributions.py in dirichlet(alpha, size, dtype)
112 """
113 rs = _generator.get_random_state()
--> 114 return rs.dirichlet(alpha, size, dtype)
115
116
~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_generator.py in dirichlet(self, alpha, size, dtype)
144 size = alpha.shape
145 else:
--> 146 size += alpha.shape
147 y = cupy.empty(shape=size, dtype=dtype)
148 _kernels.standard_gamma_kernel(alpha, self._rk_seed, y)
TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'
当输入是像这样的 numpy 数组时
import cupy as cp
import numpy as np
A = cp.random.dirichlet(np.ones(n), n)
然后我得到同样的错误。
146行的alpha.shape
是我手动检查的(n,)。这是一个 cupy bug 还是我遗漏了什么?
我正在为 CUDA 10.1 使用 cupy-cuda101 版本 8.5.0。与 cupy 和 tensorflow 有关的所有其他内容在我的 GPU (2080ti) 上都能完美运行。
这是 cupy 中的一个错误,您应该在他们的 GitHub 上报告它。
尽管有文档,但它们没有正确处理整数参数的情况。他们要求您提供元组或 None
。这就是为什么你会看到你所看到的行为。 (如果你提供了一个元组 (a, b)
,那么最终的形状应该是 (a, b, n)
.
此处的解决方法是提供您想要的形状作为长度为 1 的元组:(n,)
。注意逗号是必须的。