一般在神经网络中, softmax可以作为分类任务的输出层。其实可以认为softmax输出的是几个类别选择的概率,比如我有一个分类任务,要分为三个类,softmax函数可以根据它们相对的大小,输出三个类别选取的概率,并且概率和为1。
softmax函数的公式是这种形式:
Si代表的是第i个神经元的输出,其实就是在输出后面套一个这个函数。 首先是神经元的输出,一个神经元如下图:
神经元的输出设为:
在神经网络反向传播中,要求一个损失函数,这个损失函数其实表示的是真实值与网络的估计值的误差,知道误差了,才能知道怎样去修改网络中的权重。
损失函数可以有很多形式,这里用的是交叉熵函数,主要是由于这个求导结果比较简单,易于计算,并且交叉熵解决某些损失函数学习缓慢的问题。交叉熵的函数是这样的,其中yi是真实的分类结果:
i代表softmax的第i个输出值,是第i个样本的输出值,不是第i个神经元。
Softmax函数,或称归一化指数函数,是逻辑函数的一种推广。它能将一个含任意实数的K维向量 “压缩”到另一个K维实向量中,使得每一个元素的范围都在之间,并且所有元素的和为1。 该函数的形式通常按下面的式子给出:
其中, j = 1, …, K
softmax 的python3实现(简单的)
import numpy as np def softmax(x): """Compute softmax values for each sets of scores in x.""" e_x = np.exp(x - np.max(x)) return e_x / e_x.sum() #test example scores = [3.0, 1.0, 0.2] print(softmax(scores)) [ 0.8360188 0.11314284 0.05083836]实现一维和二维矩阵的softmax
import numpy as np def softmax(x): orig_shape = x.shape print("orig_shape",orig_shape) if len(x.shape)>1: # 矩阵 tmp = np.max(x,axis=1) x -= tmp.reshape((x.shape[0],1)) x = np.exp(x) tmp = np.sum(x,axis=1) x /= tmp.reshape((x.shape[0],1)) print("matrix") else: # 向量 tmp = np.max(x) x -= tmp x = np.exp(x) tmp = np.sum(x) x /= tmp print("vector") return x x = np.array([[1,2,3,4],[1,2,3,4]]) x1 = np.array([1,2,3,4]) print(x) print(x1) # orig_shape (2, 4) orig_shape (4,) # print(np.max(x,axis=1)) print(np.sum(x,axis=1)) # [4 4] [10 10] # print(softmax(x)) print(softmax(x1)) # [[0.0320586 0.08714432 0.23688282 0.64391426] [0.0320586 0.08714432 0.23688282 0.64391426]] [0.0320586 0.08714432 0.23688282 0.64391426] #参考:
Softmax 损失-梯度计算
softmax loss
softmax损失函数理解
简单易懂的softmax交叉熵损失函数求导
代码:
https://blog.csdn.net/Bill_zhang5/article/details/88741681
https://blog.csdn.net/qq_30468133/article/details/84954050
https://blog.csdn.net/lrs1353281004/article/details/88532613