二分类交叉熵,多分类交叉熵,focal loss

1:二分类交叉熵

a) 公式二分类交叉熵,多分类交叉熵,focal loss  ,其中二分类交叉熵,多分类交叉熵,focal loss表示网络预测结果,是一个属于(0到1)的值,我们当然希望它们的值很接近1。二分类交叉熵,多分类交叉熵,focal loss是真实标签,因为是二分类,所以,二分类交叉熵,多分类交叉熵,focal loss的值为0或者1。网络最后一层一般为sigmoid。比如,网络最后一层sigmoid之后,网络输出为0.8,若 二分类交叉熵,多分类交叉熵,focal loss= 1,代入公式则loss = -1*log(0.8);若二分类交叉熵,多分类交叉熵,focal loss= 0,loss=(1-0)*log(1-0.8)。


b) pytorch中的形式:criterion =   nn.BCEWithLogitsLoss()  

                                        loss        =   criterion(二分类交叉熵,多分类交叉熵,focal loss,二分类交叉熵,多分类交叉熵,focal loss)


c) 计算:

  •      第一种情况:out为网络输出,二分类交叉熵,多分类交叉熵,focal loss只是一个数,二分类交叉熵,多分类交叉熵,focal loss也是一个数,二分类交叉熵,多分类交叉熵,focal loss取值为0或1。

             1, 二分类交叉熵,多分类交叉熵,focal loss = sigmoid(out)

             2,根据公式,若二分类交叉熵,多分类交叉熵,focal loss取值为0,二分类交叉熵,多分类交叉熵,focal loss,若二分类交叉熵,多分类交叉熵,focal loss取值为1,二分类交叉熵,多分类交叉熵,focal loss

                  例如:令out=1.2388,二分类交叉熵,多分类交叉熵,focal loss=0,则二分类交叉熵,多分类交叉熵,focal loss,      loss=(1-0)*log(1-0.77535)=1.4932

  •      第二种情况:out是一个tensor,shap=(batch),batch个数,二分类交叉熵,多分类交叉熵,focal loss是一个tensorshape=(batch),所有数取值为0或者1。相当于求一个平均,和上面大同小异。

               1:二分类交叉熵,多分类交叉熵,focal loss = Sigmoid(out)

                2:对tensor里每个数都求一次交叉熵。和上面步骤2一样。

                 3:对所有的loss求平均。

2:多分类交叉熵1

a) 公式:二分类交叉熵,多分类交叉熵,focal loss,和上面的公式一样,只不过,现在把维度扩大,上面只有3个维度,这次有4个


b) pytorch中的形式:criterion = nn.CrossEntropyLoss()

                                        loss = criterion(二分类交叉熵,多分类交叉熵,focal loss,二分类交叉熵,多分类交叉熵,focal loss)


c) 计算:out表示网络输出,shape=(batch,class,W,H),取值任意,二分类交叉熵,多分类交叉熵,focal loss的shape=(batch,class,W,H),取值为[0,class]的整数。

例子:out.shape=(1,3,7,7)

                out = tensor([[[0.4100,0.2784,0.8864,0.2563,0.6145,0.1003,0.2250],

                                       [0.8236,0.3911,0.7626,0.4091,0.5717,0.1733,0.7634],

                                       [0.6580,0.9722,0.0596,0.5479,0.9591,0.5731,0.7304]]])

                   y   =  tensor([0.4966,1.4566,0.1086, 1.6627,0.3579,0.6607,0.3494])

      1:out进行softmax,再去对数log。具体操作是,对每一列的3个数字,进行softmax,使其3个数的概率加起来等于1,然后对这3个数取对数log。得到如下的结果(pytorch中代码是out.log_softmax(1))。

                out = tensor([[[-1.3333,-1,4160,-0.8420,-1.2538,-1.2148,-1.3030,-1.4750],

                                        [-0.9197,-1.3033,-0.9658,-1.1010,-1.2575,-1.2300,-0.9366],

                                        [-1.0854,-0.7222,-1.6688,-0.9622,-0.8702,-0.8302,-0.9696]]])

      2:将y变成y.long() 则y=tensor([0,2,0,1,0,0,0])

      3:y的取值,解释一下,0,2,0,1,0,0,0表示第1个元素要从第1=(0+1)行取,第2个元素要从第3=(2+1)行取,第3个元素要从第1=(0+1)行取,第4个元素要从第2=(1+1)行取,第5个元素要从第1=(0+1)行取,以此类推。最终的结果                                       [-1.3333,-0.7222,-0.8420,-1.1010,-1.2148,-1.3030,-1.4750]

在pytorch中的代码是:loss_tmp = nll_loss(log_softmax(out,1))

      4:将上面得到的数字取反,再求平均值。最终结果为:1.1416

3:多分类交叉熵2

a) 公式:二分类交叉熵,多分类交叉熵,focal loss,其中n表示一个batch中有n个样本,k表示任务是k分类的,如果手写数字mnist分类,k就      等于10。比如以5分类为例,网络的最后一层softmax输出是(0.1,0.3,0.4,0.1,0.1),标签是(0,1,0,0,0),则最后的损失loss为:

       二分类交叉熵,多分类交叉熵,focal loss


b) pytorch中的形式:criterion  = nn.CrossEntropyLoss()

                                        loss  =  criterion(二分类交叉熵,多分类交叉熵,focal loss,二分类交叉熵,多分类交叉熵,focal loss)


c) 计算:out表示网络输出,shape=(batch,class,lines),取值任意,二分类交叉熵,多分类交叉熵,focal loss的shape=(batch,class,lines),取值为[0,class]的整数。

     例子:out.shape=(1,3,7,7),现在模拟的是一张图片,宽高为7*7,深度为3,batch为1

二分类交叉熵,多分类交叉熵,focal loss

                   y   =  tensor([1.7231,2.9731,1.0058,0.9391,0.4274,0.9307,0.043])

      1:out进行softmax,再去对数log。具体操作是,(类似上图标红的3个数),进行softmax,使其3个数的概率加起来等于1,得到如下结果,可以看到下图圈出的3个数,加起来概率为1。

二分类交叉熵,多分类交叉熵,focal loss

               然后对这3个数取对数log。得到如下的结果(pytorch中代码是out.log_softmax(1))。

二分类交叉熵,多分类交叉熵,focal loss

      2:将y变成y.long() 则y=tensor([1,2,1,0,0,0,0]),y的值肯定是0,1,2,不会出现其他的数。

      3:y的取值,解释一下,1,2,1,0,0,0,0表示从,第1行的元素要从第2(1+1)个矩阵中取,第2行的元素要从第3(2+1)个矩阵中取,第3行的元素要从第2(1+1)个矩阵中取,第4行的元素要从第1(0+1)个矩阵中取,以此类推。

          在pytorch中的代码是:loss_tmp = nll_loss(log_softmax(out,1)),示意图如下。

二分类交叉熵,多分类交叉熵,focal loss

         最后得到的矩阵是:

二分类交叉熵,多分类交叉熵,focal loss

 

      4:将上面得到的数字取反,再求平均值。最终结果为:1.1080。

4:Focal Loss多分类)

公式: 二分类交叉熵,多分类交叉熵,focal loss,其中二分类交叉熵,多分类交叉熵,focal loss表示网络输出只经过softmax, 二分类交叉熵,多分类交叉熵,focal loss,表示的是网络输出经过softmax之后再取log,Focal Loss还等价于二分类交叉熵,多分类交叉熵,focal loss

计算:令二分类交叉熵,多分类交叉熵,focal loss二分类交叉熵,多分类交叉熵,focal loss

            则 二分类交叉熵,多分类交叉熵,focal loss二分类交叉熵,多分类交叉熵,focal loss