softmax,看名字就知道,就是如果判断输入属于某个雷的概率大于属于其它类的概率,那么这个类对应的值就逼近于1,其它类的值就逼近于0,该算法的主要应用就是多分类,而且是互斥的,即只能属于其中一个类,和sigmoid类的激活函数不同的是,一般的激活函数只能分两类,所以可以理解成softmax是sigmoid类的激活函数的扩展。它的算法如下:
也就是把所有的值用e的指数函数表示出来,求和后算每个值占的比率,保证总和为1,一般就可以认为softmax得出的就是概率.
抽象层面的原理如下所示:
在网络层面,它可以表示为:
c语言实现:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdint.h>
void softmax(const float *input, const uint32_t dim_vec, float *output)
{
float sum = 0.0f;
for(int i = 0; i < dim_vec; i++)
{
output[i] = expf(input[i]);
sum = sum + output[i];
}
for(int i = 0; i < dim_vec; i++)
{
output[i] = output[i] / sum;
}
}
int main(void)
{
float input[10] = {1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1};
float output[10]={0};
softmax(input, 10, output);
int i;
for(i = 0; i < 10; i ++)
{
printf("%f ", output[i]);
}
printf("\n");
return 0;
}
编译:
gcc softmax.c -lm -o softmax
测试:
可以看到,最后输出的概率和值是成正相关的。