Caffe中的损失函数

来源:互联网 发布:淘宝哪里有卖高仿手表 编辑:程序博客网 时间:2024/04/29 01:02

       文章从自己的QQ(632846506)2年前的日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。

       机器学习的目的就是通过对训练样本输出与真实值不一致的进行惩罚,得到损失Loss,然后采用一定的优化算法对loss进行最小优化,进而得到合理的网络权值。本文介绍Caffe中含有的常见的LossLayer及其参数设置方法。

      Caffe的LossLayer主要由6个:

(1)ContrastiveLossLayer

       对比损失函数主要用来训练siamese网络,改网络为专门处理同时输入两张图像的网络,如用于FaceVerification的DeepID网络。在改网络的最后需要对比两张图像是否为一张人脸,因此需要一个对比损失函数。目标检测暂时不会用到

(2)EuclideanLossLayer

 适合回归任务,尤其输出值为实数时。

输入blob向量:长度为2,两个(N,C,H,W)维的prediction与groundTruth blob,N张图像,在这里的CHW应该都是1.

输出blob:预测值与真实值的均方误差E,实数


(3)HingeLossLayer

      损失函数,适用于多分类任务。输入blob向量:长度为2,包括:

      预测的score值:(N,C,H,W)维,代表N个样本每一个样本在C类中的每一类上的得分。其中HW应该都为1

      真实值:(N,1,1,1),样本的真实Label

     输出blob:损失值E


其中

其中表示第n个样本在第k类上的得分,p表示L范数的阶,默认为1范数。可取2范数。

     由SVM的原理可知一层全连接网络+HingeLossLayer等价于一个线性SVM,2范数Hinge损失的SVM也叫做L2-SVM。

(4)InfogainLossLayer

       信息增益损失。MultinomialLogisticLoss的泛化版本,不仅仅接受预测的每个样本在每类上的概率信息,还接受信息增益矩阵信息。当信息增益矩阵为单位阵的时候两者是等价的。

输入blob:

             预测概率值:(N,C,H,W)维,其中HW应该为1

             真实标签:(N,1,1,1)维

             信息增益矩阵H(可选,默认为单位阵):(1,1,K,K)维,其中K为类别的个数

输出blob:误差损失E


(5)MultinomialLogisticLossLayer

      多项逻辑损失,主要处理多分类问题。当输出是每一类的概率时用这个损失函数。

      输入blob:

            预测概率值:每一个样本在每一类的概率,(N,C,H,W)维,N为样本个数,C为类别个数,HW应该均为1

            真实标签:(N,1,1,1)维

      输出blob:误差损失E,其中表示估计的样本n为其真实标签label的概率:


(5)SoftmaxLossLayer

等价于softmaxLayer+MultinomialLogisticLossLayer。在训练时用该层,测试时用softmax层。为什么要多添加一个SoftmaxLossLayer,而不是用Softmax+MltinomialLogisticLayer来做?主要原因是直接采用这种SoftmaxLoss计算梯度时在数值计算上更稳定!!!具体原因参考点击打开链接

输入blob:每个样本在每个类别的得分

输出blob:误差损失E,形式同多项逻辑损失,只不过估计概率P的来源不一样

(6)SigmoidCrossEntroyLossLayer

          Sigmoid交叉熵损失,主要用于二分类问题。等价于SigmoidLayer+CrossEntropyLayer,第一层先将score转为概率输入(为什么不是softmaxLayer转换为概率呢???对于二分类问题用Sigmoid函数计算出一个概率即可,多分类问题用softmax函数),第二层计算交叉熵损失.采用一个新层而不是由两个已有的层来实现,主要原因也是由于数值稳定性。

        输入blob:每个样本在每一类上的得分。(N,C,H,W)维,其中HW应该为1。

        输出blob:误差损失E,其中Pn表示估计的该类为类1的概率,labeln为样本n的类别(0或者1)。


        由E的定义可知,该E其实等价于MultinomialLogisticLoss中的二分类情况


最后来个提醒,Caffe中,默认每一层都可以作为LossLayer,不过层的名字中不带Loss的层其"Loss_weight"属性默认为0,即对最后的总的Loss贡献为0。名字中带Loss的层可以在网络的任意位置使用(不一定非在网络的输出最后部分),且可以有不止一个LossLayer,最后的训练所使用的Loss为所有LossLayer损失的加权和,即按下式计算:

[plain] view plain copy
  1. loss := 0  
  2. for layer in layers:  
  3.   for top, loss_weight in layer.tops, layer.loss_weights:  
  4.     loss += loss_weight * sum(top)