微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CuPy 和 Dirichlet 给了我 TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'

如何解决CuPy 和 Dirichlet 给了我 TypeError: unsupported operand type(s) for +=: 'int' and 'tuple'

我只想创建一个随机矩阵 A,它的向量是从狄利克雷分布中提取的。该函数适用于 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,dtype)
    115 
    116 

~\anaconda3\envs\tensorflow\lib\site-packages\cupy\random\_generator.py in dirichlet(self,alpha,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,)。是小虫还是我遗漏了什么?

我正在为 CUDA 10.1 使用cupy-cuda101 8.5.0 版。与 cupy 和 tensorflow 相关的所有其他内容都可以在我的 GPU (2080ti) 上完美运行。

解决方法

这是 cupy 中的一个错误,您应该在他们的 GitHub 上报告。

尽管有文档说明,但它们没有正确处理整数参数的情况。它们要求您提供元组或 None。这就是为什么你会看到你所看到的行为。 (如果您提供了一个元组 (a,b),那么结果形状将正确地为 (a,b,n)

这里的解决方法是提供您想要的形状作为长度为 1 的元组:(n,)。注意逗号是必须的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。