Caffe中的损失函数解析

Caffe中的损失函数解析

导言

在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function)。

在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损失函数,对比损失函数,信息增益损失函数等等。在这里做一个笔记,归纳总结Caffe中用到的不同的损失函数,以及分析它们各自适合的使用场景。

欧式距离损失函数(Euclidean Loss)

输入:

预测的值: y ^ ∈[?∞,+∞] , 其中,它们的形状为:N×C×H×W

标签的值: y∈[?∞,+∞] , 其中,它们的形状为:N×C×H×W

输出:

损失的值:Loss=12N ∑ N n=1 ∥y ^  n ?y n ∥ 2 2

适合场景:

回归,特别是其回归的值是实数值得时候。

对比损失函数(Contrastive loss)

输入:

形状:(N×C×1×1)  特征 a∈[?∞,+∞]

形状:(N×C×1×1)  特征 b∈[?∞,+∞]

形状:(N×1×1×1)  相似性 y∈[0,1]

输出:

形状:(1×1×1×1)

对比损失函数为: E=12N ∑ n=1 N (y)d+(1?y)max(margin?d,0)

其中 d=||a n ?b n || 2 2  .

适合场景:

可以用来训练Siamese网络

铰链损失函数(Hinge Loss)

输入:

形状:(N×C×H×W)  预测值 t∈[?∞,+∞]  代表着预测 K=CHW  个类中的得分(注:CHW表示着在网络设计中,不一定要把预测值进行向量化,只有其拉直后元素的个数相同即可。) . 在SVM中, t  是 D 维特征X∈R D×N  , 和学习到的超平面参数W∈R D×K   内积的结果 X T W

所以,一个网络如果仅仅只有全连接层 + 铰链损失函数,而没有其它的可学习的参数,那么它就等价于SVM

标签值:

(N×1×1×1)  标签 l , 是一个整数类型的数 l n ∈[0,1,2,...,K?1]  其代表在 K  个类中的正确的标签。

输出:

形状:(1×1×1×1)

损失函数计算: E=1N ∑ n=1 N ∑ k=1 K [max(0,1?δ{l n =k}t nk )] p  , L p   范数 (默认是 p=1 , 是 L1 范数; L2 范数,正如在 L2-SVM中一样,也有实现),

其中 δ{条件}={1?1 成立不成立

应用场景:

在一对多的分类中应用,类似于SVM.

信息增益损失函数(InformationGain Loss)

输入:

  1. 形状:(N×C×H×W)  预测值 p ^ ∈[0,1]  内, 表示这预测每一类的概率,共 K=CHW  个类, 每一个预测 概率p ^  n   的和为1: ?n∑ k=1 K p ^  nk =1 .
  2. 形状:(N×1×1×1)  标签值: l , 是一个整数值,其范围是 l n ∈[0,1,2,...,K?1]  表示着在 K  个类中的索引。
  3. 形状:(1×1×K×K)  (可选) 信息增益矩阵 H .作为第三个输入参数,. 如果 H=I , 则它等价于多项式逻辑损失函数

输出:

形状:(1×1×1×1)

计算公式: E=?1N ∑ n=1 N H l n  log(p ^  n )=?1N ∑ n=1 N ∑ k=1 K H l n ,k log(p ^  n,k ) , 其中 H l n    表示 行 l n   of H .

多项式逻辑损失函数(Multinomial Logistic Loss)

输入:

形状:(N×C×H×W)  预测值 p ^ ∈[0,1] 范围中, 表示这预测的每一类的概率,共 K=CHW  个类. 每一个预测概率p ^  n   的和为1: ?n∑ k=1 K p ^  nk =1 .

形状:(N×1×1×1)  标签 l , 是一个整数值,其范围是 l n ∈[0,1,2,...,K?1]  表示着在 K  个类中的索引。

输出:

形状:(1×1×1×1)  计算公式: E=?1N ∑ n=1 N log(p ^  n,l n  )

应用场景:

在一对多的分类任务中使用,直接把预测的概率分布作为输入.

Sigmoid 交叉熵损失函数(Sigmoid Cross Entropy Loss)

输入:

  1. 形状: (N×C×H×W)  得分 x∈[?∞,+∞] , 这个层使用 sigmoid 函数 σ(.)  映射到概率分布 p ^  n =σ(x n )∈[0,1]
  2. 形状:(N×C×H×W)  标签 y∈[0,1]

输出:

  1. 形状:(1×1×1×1)  计算公式: E=?1n ∑ n=1 N [p n logp ^  n +(1?p n )log(1?p ^  n )]

应用场景:

预测目标概率分布

Softmax+损失函数(Softmax With Loss)

输入:

  1. 形状:(N×C×H×W)  预测值 x∈[?∞,+∞]  代表预测每个类的得分。 共 K=CHW  类. 这一层把得分通过softmax映射到概率分布 p ^  nk =exp(x nk )/[∑ k ′  exp(x nk ′  )]
  2. 形状:(N×1×1×1)  标签值 是一个整数值,其范围是 l n ∈[0,1,2,...,K?1]  表示着在 K  个类中的索引。

输出:

  1. 形状:(1×1×1×1)  计算公式: E=?1N ∑ n=1 N log(p ^  n,l n  ) , 其中 p ^   为softmax输出的类概率。

应用场景:

在一对多分类中应用。

时间: 2024-10-12 04:28:45

Caffe中的损失函数解析的相关文章

Caffe中im2col的实现解析

这里,我是将Caffe中im2col的解析过程直接拉了出来,使用C++进行了输出,方便理解.代码如下: 1 #include<iostream> 2 3 using namespace std; 4 5 bool is_a_ge_zero_and_a_lt_b(int a,int b) 6 { 7 if(a>=0 && a <b) return true; 8 return false; 9 } 10 11 void im2col_cpu(const float*

Caffe中对MNIST执行train操作执行流程解析

之前在 http://blog.csdn.net/fengbingchun/article/details/49849225 中简单介绍过使用Caffe train MNIST的文章,当时只是仿照caffe中的example实现了下,下面说一下执行流程,并精简代码到仅有10余行: 1.        先注册所有层,执行layer_factory.hpp中类LayerRegisterer的构造函数,类LayerRegistry的AddCreator和Registry静态函数:关于Caffe中Lay

神经网络caffe框架源码解析--softmax_layer.cpp类代码研究

// Copyright 2013 Yangqing Jia // #include <algorithm> #include <vector> #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" using std::max; namespace caffe { /**

神经网络caffe框架源码解析--data_layer.cpp类代码研究

dataLayer作为整个网络的输入层, 数据从leveldb中取.leveldb的数据是通过图片转换过来的. 网络建立的时候, datalayer主要是负责设置一些参数,比如batchsize,channels,height,width等. 这次会通过读leveldb一个数据块来获取这些信息. 然后启动一个线程来预先从leveldb拉取一批数据,这些数据是图像数据和图像标签. 正向传播的时候, datalayer就把预先拉取好数据拷贝到指定的cpu或者gpu的内存. 然后启动新线程再预先拉取数

Caffe中Solver方法(HGL)

Solver就是用来使loss最小化的优化方法,loss是损失函数.损失函数最小的目标就是求解全局最小值. 假设有数据集(X1, X2, -, Xn),对应的(y1, y2, -, yn),其中每个Xi对应m个元素.loss函数定义为 其中,F(X)为模型.假设F(X)为线性函数: , x0 = 1 目标:min Φ(θ),loss函数最小.估计最优系数(θ0, θ1, θ2, -, θm). 预备知识:梯度下降法(最速下降法) 顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值. 具

CAFFE中训练与使用阶段网络设计的不同

神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正要使用训练好的数据时,我们需要的是网络给我们输入结果,对于分类问题,我们需要获得分类结果,如下右图最后一层我们得到 的是概率,我们不需要训练及测试阶段的LOSS,ACCURACY层了. 下图是能过$CAFFE_ROOT/python/draw_net.py绘制$CAFFE_ROOT/models/caf

caffe 中 python 数据层

caffe中大多数层用C++写成. 但是对于自己数据的输入要写对应的输入层,比如你要去图像中的一部分,不能用LMDB,或者你的label 需要特殊的标记. 这时候就需要用python 写一个输入层. 如在fcn 的voc_layers.py 中 有两个类: VOCSegDataLayer SBDDSegDataLayer 分别包含:setup,reshape,forward, backward, load_image, load_label. 不需要backward 没有参数更新. import

caffe中权值初始化方法

首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代码的具体的话,可以看:http://blog.csdn.net/xizero00/article/details/50921692,写的还是很不错的(不过有的地方的备注不对,不知道改过来了没). 文件 filler.hpp提供了7种权值初始化的方法,分别为:常量初始化(constant).高斯分布初

转:在java中使用dom4j解析xml

在java中使用dom4j解析xml 虽然Java中已经有了Dom和Sax这两种标准解析方式 但其操作起来并不轻松,对于我这么一个初学者来说,其中部分代码是活生生的恶心 为此,伟大的第三方开发组开发出了Jdom和Dom4j等工具 鉴于目前的趋势,我们这里来讲讲Dom4j的基本用法,不涉及递归等复杂操作 Dom4j的用法很多,官网上的示例有那么点儿晦涩,这里就不写了 首先我们需要出创建一个xml文档,然后才能对其解析 xml文档: <?xml version="1.0" encod