当前位置:   article > 正文

Caffe Loss 层 - LossLayers_caffe支持的loss层

caffe支持的loss层

Caffe Loss 层

Loss 计算的是网络输出的 target 值与真实label之间的误差,最小化以优化网络.

Loss 值由 forward-pass 计算得到,并在 backward-pass 计算关于 loss 的梯度值.

Caffe 主要提供了以下 Loss 层:

1. SoftmaxWithLoss

用于一对多(one-of-many) 的分类任务,计算多项 logistic 损失值. 通过 softmax 来传递实值预测值,以得到关于各类的概率分布.

该网络层可以分解为 SoftmaxLayer + MultinomialLogisticLoss 层的组合,不过其梯度计算更加数值稳定.

测试时,该网络层可以由 SoftmaxLayer 层代替.

1.1 Forward 参数

输入参数

  • Input 1 - 预测值 x(N×C×H×W),其值区间为 [inf,inf],表示对于 K=CHW 类的每一类的预测分数值.

    通过 SoftmaxLayer p^nk=exp(xnk)[kexp(xnk)] 来将预测值(scores) x 映射得到关于各类别的概率分布.

  • Input2 - 真实值 label l(N×1×1×1),实值,区间为 ln[0,1,2,...,K1],分别表示 K 类中的真实类别标签 label.

输出参数:

  • Output 1 - 计算的 cross-entropy 分类 loss 值,(1×1×1×1)E=1Nn=1Nlog(p^n,ln)p^ 是 Softmax 输出的类别概率. [注:SoftmaxLayer 只是输出每一类的概率值,并不与 label 作比较.]

1.2 Backward 参数

计算关于预测值的 softmax loss 误差值梯度.

不计算关于 label 输入[bottom[1]]的 梯度.

template<typename Dtype >
void caffe::SoftmaxWithLossLayer< Dtype >::Backward_cpu (   
    const vector< Blob< Dtype > *> &    top,
    const vector< bool > &  propagate_down,
    const vector< Blob< Dtype > *> &    bottom 
)   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数:

  • top - (1×1×1×1),其 diff 为 loss_weight λ,因为 λ 是该层输出 li 的系数,整体网络 Loss E=λili+other loss terms,有 Eli=λi.

  • propagate_down[1] - 必须是 false,因为不对 label 作梯度计算.

  • bottom - [0] (N×C×H×W),预测值 x;backward 计算 diff Ex.

    ​ [1] (N×1×1×1),labels,忽略,不计算.

1.3 prototxt 定义

layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "fc8"
  bottom: "label"
  top: "loss"
  loss_param{
    ignore_label:0  # 指定 label 值,在计算 loss 时忽略该值.
    normalize: true # 如果为 true,则基于当前 labels 数量(不包含忽略的 label) 进行归一化; 否则,只是加和.
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2. EuclideanLoss

计算两个输入的平方和.

用于实值回归任务.

Euclidean Loss 计算:E=12Nn=1N||y^nyn||22.

可以用于最小二乘(least-squares) 回归任务. 将 InnerProductLayer 的输出值作为 EuclideanLossLayer 的输入,即是线性最小二乘回归问题.

2.1 Forward 参数

输入参数:

  • Input 1 - (N×C×H×W),预测值 y^[inf,inf]
  • Input 2 - (N×C×H×W)),目标值y[inf,inf]

输出参数:

  • Output 1 - (1×1×1×1),计算的 Euclidean Loss 值.

2.2 Backward 参数

计算关于输入的 Euclidean 误差梯度.

template<typename Dtype >
void caffe::EuclideanLossLayer< Dtype >::Backward_cpu   (   
    const vector< Blob< Dtype > *> &    top,
    const vector< bool > &  propagate_down,
    const vector< Blob< Dtype > *> &    bottom 
)   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数:

  • top - 如上.

  • propagate_down - EuclideanLossLayer 可以计算关于 label (bottom[1]) 的梯度.

  • bottom - [0] (N×C×H×W),预测值 y^;backward 计算梯度 diff Ey^=1nn=1N(y^nyn).

    ​ [1] (N×C×H×W),真实值 y;backward 计算梯度 diff Ey=1nn=1N(yny^n).

2.3 prototxt 定义

layer {
  name: "loss"
  type: "EuclideanLoss"
  bottom: "pred"
  bottom: "label"
  top: "loss"
  loss_weight: 1
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. MultinomialLogisticLoss

多项 logistic 损失函数层,用于一对多的分类任务,其直接采用预测的概率分布作为网络层输入.

当预测值不是概率分布时,应该采用 SoftmaxWithLossLayer,其在计算多项 logistic loss 前,采用 SoftmaxLayer 将预测值映射到概率分布.

3.1 Forward 参数

输入参数:

  • Input 1 - 预测值 p^(N×C×H×W),其取值区间 [0,1],表示对于 K=CHW 类的预测概率.

    每个预测向量 p^n 的和应该为 1,nk=1Kp^nk=1.

  • Input2 - 真实值 label l(N×1×1×1),实值 ln[0,1,2,...,K1],为 K 类 classes 中的真实类别标签.

输出参数:

  • Output 1 - (1×1×1×1),计算的多项 logistic loss 值:E=1Nn=1Nlog(p^n,ln).

3.2 prototxt 定义

layer {
  name: "loss"
  type: "MultinomialLogisticLoss"
  bottom: "fc8"
  bottom: "label"
  top: "loss"
  loss_param{
    ignore_label:0
    normalize: true
    FULL = 0
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
message LossParameter {
  optional int32 ignore_label = 1;
  enum NormalizationMode {
    FULL = 0;
    VALID = 1;
    BATCH_SIZE = 2;
    NONE = 3;
  }
  optional NormalizationMode normalization = 3 [default = VALID];
  optional bool normalize = 2;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4. InfogainLoss

信息增益损失函数

InfogainLossLayer 是 MultinomalLogisticLossLayer 的一种泛化形式.

其采用“信息增益”(information gain, infogain) 矩阵来指定所有的 label pairs 的“值”(value).

不仅仅接受预测的每个样本在每类上的概率信息,还接受信息增益矩阵信息.

当 infogain 矩阵是单位矩阵时,则与 MultinomalLogisticLossLayer 等价.

message InfogainLossParameter {
  // Specify the infogain matrix source.
  optional string source = 1;
  optional int32 axis = 2 [default = 1]; // axis of prob
}
  • 1
  • 2
  • 3
  • 4
  • 5

4.1 Forward 参数

输入参数:

  • Input 1 - 预测值 p^(N×C×H×W),其取值区间 [0,1],表示对于 K=CHW 类的预测概率.

    每个预测向量 p^n 的和应该为 1,nk=1Kp^nk=1.

  • Input2 - 真实值 label l(N×1×1×1),实值 ln[0,1,2,...,K1],为 K 类 classes 中的真实类别标签.

  • Input3 - (optional), 1×1×K×K,infogain 矩阵 H.

输出参数:

  • Output 1 - (1×1×1×1),计算的 infogain 多项 logistic loss 值:E=1Nn=1NHlnlog(p^n,ln)=1Nn=1Nk=1KHlnlog(p^n,k).

    其中 Hln 表示 infogain 矩阵 H 的第 ln 行.

4.2 prototxt 定义

layer {
    bottom: "score"
    bottom: "label"
    top: "infoGainLoss"
    name: "infoGainLoss"
    type: "InfogainLoss"
    infogain_loss_param {
        source: "/.../infogainH.binaryproto"
        axis: 1  # compute loss and probability along axis
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5. HingeLoss

用于一对多 的分类任务.

其有时也被叫做 Max-Margin Loss. SVM 的目标函数也层用过.

比如,二分类情况时,

l(y)=max(0,1ty)

y 为[-1, 1]区间的预测值,t=[+1,1] 为目标值.

也就是 |y|1,也就是对某个正确分类的样本距离分割线的距离大于1时,不给予任何奖赏,避免分类过度注重某些类,更关注与整体的分类 Loss.

message HingeLossParameter {
  enum Norm {
    L1 = 1;
    L2 = 2;
  }
  // Specify the Norm to use L1 or L2
  optional Norm norm = 1 [default = L1];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.1 Forward 参数

输入参数:

  • Input 1 - 预测值 t(N×C×H×W),其取值区间 [infinf],表示对于 K=CHW 类的预测概率.

    在 SVM 中,假设 D-dim 特征 XRD×N 和学习的超参数 WRD×Kt 是內积 XTW 的结果.

    因此,如果网络只有一个 InnerProductLayer,其num_output=D,将其输出的预测值输入到 HingeLossLayer,且没有其它待学习参数或 losses,则等价于 SVM.

  • Input2 - 真实值 label l(N×1×1×1),实值 ln[0,1,2,...,K1],为 K 类 classes 中的真实类别标签.

输出参数:

  • Output 1 - (1×1×1×1),计算的 hinge loss 值:E=1Nn=1Nk=1K[max(0,1δ{ln=k}tnk)]p

    Lp 范数,默认 p=1,L1 范数;p=2,L2 范数,如 L2-SVM.

    δ{condition}=1,if condition;otherwise,δ{condition}=1

5.2 prototxt 定义

# L1 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"
  bottom: "label"
}

# L2 Norm
layer {
  name: "loss"
  type: "HingeLoss"
  bottom: "pred"
  bottom: "label"
  top: "loss"
  hinge_loss_param {
    norm: L2
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

6. ContrastiveLoss

Caffe Siamese Network 采用了 ContrastiveLoss 函数,能够有效的处理 paired data.

Caffe - mnist_siamese.ipynb.

ContrastiveLoss 计算公式:

E=12Nn=1N(y)d2+(1y)max(margind,0)2

其中,d=||anbn||2.

message ContrastiveLossParameter {
  // margin for dissimilar pair
  optional float margin = 1 [default = 1.0];
  // The first implementation of this cost did not exactly match the cost of
  // Hadsell et al 2006 -- using (margin - d^2) instead of (margin - d)^2.
  // legacy_version = false (the default) uses (margin - d)^2 as proposed in the
  // Hadsell paper. New models should probably use this version.
  // legacy_version = true uses (margin - d^2). This is kept to support /
  // reproduce existing models and results
  optional bool legacy_version = 2 [default = false];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

6.1 Forward 参数

输入参数:

  • Input 1 - (N×C×1×1),特征 a[inf,inf]

  • Input2 - (N×C×1×1),特征 b[inf,inf]

  • Input3 - N×1×1×1,二值相似度 s[0,1]

输出参数:

  • Output 1 - (1×1×1×1),计算的 contrastive loss 值E,用于训练 siamese 网络.

6.2 prototxt 定义

layer {
  name: "loss"
  type: "ContrastiveLoss"
  bottom: "feat"
  bottom: "feat_p"
  bottom: "sim"
  top: "loss"
  contrastive_loss_param {
    margin: 1
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

From mnist_siamese_train_test.prototxt

7. Accuracy

计算 一对多 分类任务的分类精度.

没有 backward 计算.

message AccuracyParameter {
  // top_k 精度
  optional uint32 top_k = 1 [default = 1];

  // The "label" axis of the prediction blob, whose argmax corresponds to the
  // predicted label -- may be negative to index from the end (e.g., -1 for the
  // last axis).  For example, if axis == 1 and the predictions are
  // (N x C x H x W), the label blob is expected to contain N*H*W ground truth
  // labels with integer values in {0, 1, ..., C-1}.
  optional int32 axis = 2 [default = 1];

  // 精度计算,忽略 ignore_label 
  optional int32 ignore_label = 3;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

7.1 参数

AccuracyLayer 提供了 AccuracyParameter accuracy_param 参数选项:

  • top_k - 可选,默认为 1. 选取最大的 k 个预测值为正确预测. 如,k=5 表示,如果 groundtruth label 在 top 5 的预测 labels 内,则认为是预测正确.

Reference

[1] - 交叉熵代价函数(损失函数)及其求导推导

[2] - caffe层解读系列——hinge_loss

[3] - 损失函数改进方法总览

[4] - 视觉分类任务中处理不平衡问题的loss比较

[5] - Caffe Loss层 - HingelossLayer

[6] - caffe Namespace Reference

[7] - 机器学习中的损失函数 (着重比较:hinge loss vs softmax loss)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/133331
推荐阅读
相关标签
  

闽ICP备14008679号