import numpy as np
def softmax(x):
""" softmax function """
# assert(len(x.shape) > 1, "dimension must be larger than 1")
# print(np.max(x, axis = 1, keepdims = True)) # axis = 1, 行
x -= np.max(x, axis = 1, keepdims = True) #为了稳定地计算softmax概率, 一般会减掉最大的那个元素
print("减去行最大值 :\n", x)
x = np.exp(x) / np.sum(np.exp(x), axis = 1, keepdims = True)
return x
x = np.random.randint(low = 1, high = 5, size = (2, 3)) #生成一个2x3的矩阵,取值范围在1-5之间
print("原始 :\n", x)
x_ = softmax(x)
print("变换后 :\n", x_)
![softmax(x)_i = \frac{e^{x_i}}{\sum_j e^{x_j}}](https://private.codecogs.com/gif.latex?%5Cdpi%7B200%7D%20softmax%28x%29_i%20%3D%20%5Cfrac%7Be%5E%7Bx_i%7D%7D%7B%5Csum_j%20e%5E%7Bx_j%7D%7D)
需要注意的地方是:
- 为了稳定地计算softmax概率, 一般会减掉最大的那个元素
- numpy里面axis = 1指的是行,axis = 0才是列
- np.exp(x)对矩阵或者更高维运算的话,会对矩阵内每个值直接取指数
结果如下:
![](https://img-blog.csdn.net/2018101810254751?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l5aGhsYW5jZWxvdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)