2016/9/14
Caffe中和其他大部分机器学习一样,通过一个损失函数(或者叫做误差,成本,目标函数)。一个损失函数通过规划参数设置来确定学习的目标。因此,学习的目标是寻找参数的集合来最小化损失函数。
Caffe中Loss是通过网络的前向通道计算的。每一层输入一系列Blob并输出一系列Blob。一些层的输出会被用于损失函数计算。一个典型的一对多分类任务的损失函数是SoftmaxWithLoss函数。在网络中是这样定义的:
Layer{
name: "loss"
type: "SoftmaxWithLoss"
bottom: "pred"
bottom: "label"
top: "loss"
}
SoftmaxWithLoss函数中,输出(top)blob是一个损失平均值的标量。损失通过预测标签pred和实际标签label来计算。
Loss weights
对于具有多个损失函数的网络(例如一个网络使用SoftmaxWithLoss层进行输如分类,并使用EuclideanLoss层进行重建),损失权重可以用来调整不同损失函数的相对重要性。
按照惯例,带有Loss后缀的Caffe层是损失函数层,其他层被假定进行单纯的中间计算。但实际上,任何层都可以被用作损失层,只需要在层定义中对每一个输出(top)加入损失权重(loss_weight)。具有Loss后缀的层隐式的定义了损失权重:第一个top(输出)为1,其他top为0,其他层所有的top的损失权重都被隐式定义为0。
因此上面的SoftMaxWithLoss层可以等价写为:
Layer{
name: "loss"
type: "SoftmaxWithLoss"
bottom: "pred"
bottom: "label"
top: "loss"
loss_weight: 1
}
然而,任何可以反向传播的层都可以赋予一个非零的损失权重。例如可以规范化中间层的活动。对于具有非零损失的非单一输出,损失只需要简单将blob相加。
最终的损失通过整个网络中的损失的权重相加计算得到。计算伪代码: