如何在 GPU 上的数组上运行 expit 函数?

Posted

技术标签:

【中文标题】如何在 GPU 上的数组上运行 expit 函数?【英文标题】:How do I run expit function on an array on a GPU? 【发布时间】:2021-02-08 23:15:18 【问题描述】:

我正在尝试对基于简单神经网络的手写数字识别应用程序进行基准测试。它目前使用 Numpy 作为矩阵,使用 scipy 的 expit 函数进行激活。和这个一样好(非常基本的网络),我想在 GPU 上运行这整个东西,因此决定使用 Cupy 库。

很遗憾,我无法让 expit 函数在 GPU 上运行。我不断收到一条错误消息,指出“未实施”。

self.activation_function = lambda x: scipy.special.expit(x)

错误信息

TypeError: 操作数类型全部返回 NotImplemented from array_ufunc(, 'call', array([[ 0.96079161], [1.37400426], [-0.46329254]])): 'ndarray'

【问题讨论】:

【参考方案1】:

我今天也遇到了同样的问题,你可以试试用 CuPy 的User-Defined Kernels 定义函数。

对于 sigmoid 函数:

import cupy as cp

expit = cp.ElementwiseKernel(
        'float64 x',
        'float64 y',
        'y = 1 / (1 + exp(-x))',
        'expit')

>>> x = cp.arange(10, dtype=np.float64).reshape(2, 5)
>>> expit(x)
array([[0.5       , 0.73105858, 0.88079708, 0.95257413, 0.98201379],
       [0.99330715, 0.99752738, 0.99908895, 0.99966465, 0.99987661]])

>>> scipy.special.expit(x.get())
array([[0.5       , 0.7310586 , 0.880797  , 0.95257413, 0.98201376],
       [0.9933072 , 0.9975274 , 0.999089  , 0.99966466, 0.9998766 ]],
      dtype=float32)

【讨论】:

以上是关于如何在 GPU 上的数组上运行 expit 函数?的主要内容,如果未能解决你的问题,请参考以下文章

编写一次并行数组 Haskell 表达式,在 CPU 和 GPU 上运行 repa 并加速

在 GPU 而不是 Ubuntu 上的 CPU 上运行 Spyder 代码

如何对 INTEL GPU 进行编程

TensorFlow如何入门?

如何确定缓冲区是在 GPU 上还是在 CPU 上?

sh 在GCP上运行Docker上的tensorflow GPU