1.sigmoid
这个可以将输入归一化到0~1之间
该函数也叫Logistic函数
优点:平滑、易于求导。
缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
计算公式如下图所示:
2.softmax
softmax也是一个归一化函数,是归一化指数函数,其公式如下图所示
函数的输入是从K个不同的线性函数得到的结果,而样本向量 x 属于第 j 个分类的概率为:
对了,需要注意,如果在pytorch中使用该函数,需要将除了batch之外的flatten打平
3.softmax2d
同softmax原理一样,不同的是,这是二维的softmax,同一channel的数值相加为1,而不是像softmax一样,达成一个维度,改维度内的所有数值相加为1.
如下图为例:
4.BCELoss
这个loss跟pytorch中的nn.functional.binary_cross_entropy是同样的,一摸一样的loss
计算公式如下图所示:
其中y代表label,x代表input
这个是W*H中的逐个像素的计算,最后累加求平均(也可以选择是求和)
5.BCEwithlogitsLoss
这个就是在BCELoss()的基础上加了一个sigmoid,注意只在输入上加了sigmoid
BCEwithlogitsLoss=BCELoss(sigmoid(input),target)
6.CrossEntropyLoss
这个只适用于确定分类的分类,某些情况下不适合:譬如说,关键点检测的分割网络中,一般会在关键点周围造一个高斯核,对应到channel当中就会表示其属于每个分类的置信度,但对于核周边的像素点,我们不确定是否将其归纳到某一分类,如果使用CrossEntropyLoss就太过确定了(不存在高斯核,只有int的分类标签),其target为3D的Tensor,格式为[batch,samples(一个样本中待分类的像素的个数或者对应的维度大小)],数值为对应的类别(应该取哪一个channel的数值计算loss),以下举例说明:
第一步:生成输入和target
第二步:计算softmax
第三步:计算log:
第四步:
计算NLL Loss:
这一步解释一下,因为target为两个0,代表都是0分类,所以都是将channel_0的元素取出来去掉符号相加除以2,这就是NLLLoss()完成的事情
所以,总结来说,CrossEntropyLoss的流程为:
NLLLoss(log(softmax(input)),target)
其执行了softmax,log,NLLLoss()
**
7.NLLLoss()
**
通过以上的介绍,就可以知道NLLLoss()的计算过程
关于每个函数的数学意义,将在下一篇博客中进行介绍。