# 适用批输入的softmax函数
def Softmax(x):
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
# 为什么要转置 原因是Numpy数组的扩张原理是把行向量复制扩张成矩阵 例子如下
# X2 = np.array([[1, 2, 3], [3, 2, 1], [1, 2, 4]])
# np.max(X2, axis=1) 作用是取得各行的的最大值
# 返回的是一个行向量,在和二维矩阵做加减运算的的扩充操作是将每行都变成这个行向量
# 所以X2 - np.max(X2, axis=1) 不是计算X2的各行减去各行的最大值
# np.max(X2, axis=1) 返回的是 [3, 3, 4]
# 在计算时扩张成:
# [3, 3, 4]
# [3, 3, 4]
# [3, 3, 4]
# 而要达到计算目的的矩阵是
# [3, 3, 3]
# [3, 3, 3]
# [4, 4, 4]
x = x - np.max(x) # 溢出对策
return np.exp(x) / np.sum(np.exp(x))