参考博客 激活函数之softmax介绍及C++实现及其评论区
Lambda使用参考博客:C++ 11 Lambda表达式
函数功能,输入vector<float>
数组,修改原数组为softmax后输出。即实现下面的公式:
softmax
(
x
)
i
=
exp
(
x
i
−
x
m
a
x
)
∑
j
=
1
n
exp
(
x
j
−
x
m
a
x
)
\operatorname{softmax} (\mathrm{x})_{i}=\frac{\exp \left(\mathrm{x}_{i}-\mathrm{x}_{max}\right)}{\sum_{j=1}^{n} \exp \left(\mathrm{x}_{j}-\mathrm{x}_{max}\right)}
softmax(x)i=∑j=1nexp(xj−xmax)exp(xi−xmax)
void softmax(std::vector<float> &input){
float maxn = 0.0;
float sum= 0.0;
maxn = *max_element(input.begin(), input.end());
std::for_each(input.begin(), input.end(), [maxn,&sum](float& d) {
d=exp(d-maxn);sum+=d;}); //cmath c11
std::for_each(input.begin(), input.end(), [sum](float& d) { d=d/sum;});
return;
}
/*
testInput: {1.9502,-2.125,2.60156,2.05078,-1.77539,-4.21875}
output: 0.245873 0.00417709 0.471621 0.271889 0.00592526 0.000514719
*/
和Libtorch的softmax方法对比,结果差距在小数点后9位。
btw,vector实现求和的stl方法:
sum = accumulate(input.begin(),input.end(),0);// include<numeric>
Done.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。