softmax,argmax,soft-argmax 理解

参考https://www.cnblogs.com/king-lps/p/9937440.html

1)softmax:

softmax是一种指数归一化函数。
在这里插入图片描述

import numpy as np
data=np.array([0.1, 0.3, 0.6, 2.1 ,0.55])
np.exp(data)/np.sum(np.exp(data))          # softmax

output :array([0.07795756, 0.09521758, 0.12853029, 0.57603278, 0.12226179])

向量中的参数被归一化,总和为1。

2) argmax:

寻找参数最大值的索引,但是该过程不可导

 a = np.array([[1, 5, 5, 2],
              [9, 6, 2, 8],
              [3, 7, 9, 1]])
print(np.argmax(a, axis=0)) #axis = 0 表示输出最大值索引值的"轴"

output: [1 2 2 1]

print(np.argmax(a, axis=1)) #换了一个维度

output:[1 0 2]

3)soft-argmax:

结合softmax函数 ,达到argmax的目的,同时使得过程可导。

在这里插入图片描述

np.sum(np.exp(data)/np.sum(np.exp(data)) * np.array([0,1,2,3,4]))    # E = p*index

output:2.5694236670240085

解读:

归一化后的向量 乘以 索引值向量
array([0.07795756, 0.09521758, 0.12853029, 0.57603278, 0.12226179])
array([ 0 , 1 , 2 ,3 ,4 ])
不难发现,越大的值,其索引值的权重也越大。
所以能产生我们想要的结果(寻找最大值的索引值)。

改进:

从上面看到位置计算不够准确(2.57 -> 3),一个原因就是最大值的概率不够大,或者说增大相对最大值而减弱其他值的影响就可以得到更加准确的位置坐标。

在这里插入图片描述

>>>d = data*10       # beta=10
array([  1. ,   3. ,   6. ,  21. ,   5.5])
>>> np.sum(np.exp(d)/np.sum(np.exp(d)) *np.array([0,1,2,3,4]))
2.9999998429934758

以beta=10为例子,可以看到放大后的数据,准确度高了很多。基本能满足要求。

可见此时输出的坐标为2.99,即为3,且这种寻找极值所在位置(坐标)的方法是可微的。常用于图像特征点位置的提取。

猜你喜欢

转载自blog.csdn.net/qq_38682032/article/details/88607568