向量化泄漏ReLU激活功能-更好的实现?

问题描述

我已经使用Vector<T>类在C#中实现了Leaky ReLU activation function,如下所示:

public void Fn(double[] v,double[] w,int startIdx,int endIdx)
{
    // Init constants.
    var avec = new Vector<double>(0.001);
    int width = Vector<double>.Count;

    int i=startIdx;
    for(; i <= endIdx-width; i += width)
    {
        // Load values into a vector.
        var vec = new Vector<double>(v,i);

        // Apply max(val,0) to each element in the vector.
        var maxResult = Vector.Max(vec,Vector<double>.Zero);

        // Apply min(val,0) to each element in the vector.
        var minResult = Vector.Min(vec,Vector<double>.Zero);

        // Multiply by scaling factor 'a'.
        minResult *= avec;

        // Add minResult and maxResult.
        minResult += maxResult;

        // Copy the final result back into arr.
        minResult.CopyTo(w,i);
    }

    // Handle vectors with lengths not an exact multiple of vector width.
    for(; i < endIdx; i++) {
        w[i] = Fn(v[i]);
    }
}

(注意。我打算将其转换为使用Span<double>而不是数组;当我最初编写代码时,跨度对我不可用。)

为清楚起见,这是一个简单的标量(即非矢量化)实现,它作用于单个输入值而不是输入值数组:

public double Fn(double x)
{
    const double a = 0.001;

    double y;
    if (x > 0.0) {
        y = x;
    } else {
        y = x * a;
    }
    return y;
}

我想知道向量化的实现是否可以改进/优化。例如。它目前正在有效地执行标量函数的两个分支,并将两个“分支”的结果结合起来以给出最终输出,但是也许有更好/更快的实现?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...