如何解决向量化泄漏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 举报,一经查实,本站将立刻删除。