本节说caffe中常见loss的推导,具体包含下面的cpp。

multinomial_logistic_loss_layer.cpp

01

multinomial_logistic_loss_layer.cpp

数学定义

x是输入,y是label,l是loss

上述式只有当样本i属于第k类时,y k=1,其他情况 y k=0,我们计不为0的 y k=y。

forward & backward

forward对所有求和,注意此处没有对图像维度的像素进行归一化,只对batch size维度进行归一化,num就是batch size,这与下面的softmaxlosslayer是不一样的。

void MultinomialLogisticLossLayer<Dtype>::Forward_cpu(

backward可以自己去看,很简单就不说了

02

softmax_layer.cpp

数学定义

softmax是我们最熟悉的了,分类任务中使用它,分割任务中依然使用它。Softmax loss实际上是由softmax和cross-entropy loss组合而成,两者放一起数值计算更加稳定。

令z是softmax_with_loss层的输入,f(z)是softmax的输出,则

单个像素i的softmax loss等于cross-entropy error如下

展开上式:

在网络中,z是即bottom blob,l(y,z)是top blob,反向传播时就是要根据top blob diff得到bottom blob diff,所以要得到

下面求loss对z的第k个节点的梯度

可见,传给groundtruth label节点和非groundtruth label是的梯度是不一样的。

forward就不看了,看看backward吧。

Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();

Test_softmax_with_loss_layer.cpp

作为loss层,很有必要测试一下,测试也分两块,forward和backward。

Forward测试是这样的,定义了个bottom blob data和bottom blob label,给data塞入高斯分布数据,给label塞入0~4。

blob_bottom_data_(new

然后分别ingore其中的一个label做5次,最后比较,代码如下。

Dtype accum_loss = 0;

至于backwards,直接套用checker.CheckGradientExhaustive就行,它自己会利用数值微分的方法和你写的backwards来比较精度。

TYPED_TEST(SoftmaxWithLossLayerTest,

03

eulidean_loss_layer.cpp

euclidean loss就是定位检测任务中常用的loss。

数学定义:

forward & backward

void EuclideanLossLayer<Dtype>::Backward_cpu(const

testcpp就不说了。

04

sigmoid_cross_entropy_loss_layer.cpp

与softmax loss的应用场景不同,这个loss不是用来分类的,而是用于预测概率,所以在loss中,没有类别的累加项。

令第i个节点输入Xi ,输出总loss为l,label为 yi ,则loss定义如下

其中

上式子有个等价转换,这是为了更好的理解caffe 中forward的计算,公式太多我就直接借用了,如果遇到了原作者请通知我添加转载申明。

http://blog.csdn.net/u012235274/article/details/51361290

反向求导公式如下:

在经过上面的转换后,避开了数值计算不稳定的情况,caffe中的源码是对整个的bottom[0]->count进行计算累加的,没有区分label项。

for (int i = 0; i < bottom[0]->count(); ++i) {

反向传播很简单就不看了

05

contrastive_loss_layer.cpp

有一类网络叫siamese network,它的输入是成对的。比如输入两张大小相同的图,网络输出计算其是否匹配。所采用的损失函数就是contrastive loss

数学定义:

d就是欧氏距离,y是标签,如果两个样本匹配,则为1,否则为0. 当y=1,loss就是欧氏距离,说明匹配的样本距离越大,loss越大。当y=0,就是与阈值margin的欧式距离,说明不匹配的样本,欧氏距离应该越大越好,超过阈值最好,loss就等于0.

反向传播其实就是分y=1和y=0两种情况下的euclidean loss的反向传导,由于与euclidean

06

hinge_loss_layer.cpp

这是一个多分类的loss, 也是SVM的目标函数,没有学习参数的全连接层InnerProductLayer+HingeLossLayer就等价于SVM。

数学定义:

这个层的输入bottom[0]是一个N*C*H*W的blob,其中取值任意值,label就是N*1*1*1,其中存储的就是整型的label{0,1,2,…,k}。tnk  相当于SVM中的

参考博客http://blog.leanote.com/post/braveapple/Hinge-Loss-%E7%9A%84%E7%90%86%E8%A7%A3

假如预测类别数是K个,正确的label是M,预测值为tnk,即是第n个样本对第k类的预测值,那么当k=M时。

当k!=M时,

其中p=1,p=2分别对应L1范数和L2范数,以L1为例

Forward

caffe_copy(count, bottom_data, bottom_diff);

只需要根据上面的转化后的式子,在正确label处乘以-1,然后累加即可。

再看反向梯度求导:

当进行一次forward之后,

bottom_diff=[max(0,1+t0),max(0,1+t1),...,max(0,1−tk),...,max(0,1−tK-1)]

我们现在要求梯度,期望是1+tk>0时为1,1-tk>0时为-1,其他情况为0,

当任意一项1+tk或者1-tk<0时,会有梯度=0。实际上就是求上面向量各自元素的符号,当1+tk>0,sign(1+tk),只是max(0,1−tk)这个应该反过来,当1-tk>0时,sign(tk-1)=-1。

代码如下:

Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();

}

07

infogain_loss_layer.cpp

数学定义:

输入bottom_data是N*C*H*W维向量,bottom_label是N*1*1*1维向量,存储的就是类别数。它还有个可选的bottom[2],是一个infogain matrix矩阵,它的维度等于num_of_label * num_of_label。每个通道c预测的是第c类的概率,取值0~1,所有c个通道的概率相加=1。是不是像soft Max?

实际上它内部就定义了shared_ptr<Layer<Dtype> > softmax_layer_,用于映射输入。

Loss定义如下:

其中 代表H的第ln行,K是所有类别数,如果H是一个单位矩阵,那么只有对角线有值,回到文章开头,这就是multinomial_logistic_loss_layer。当H是一个普通矩阵时,当groundtruth label为k,

时,值也可以非零。这样各个类别之间就不存在竞争关系了,后来的mask-rcnn中实际上loss也就是去除了这重竞争关系。

Forward:

void InfogainLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,

上面与multinomial_logistic_loss_layer的区别就在于每一项乘了infogain_mat[label_value *  num_labels_ + l]。

Backward:

for (int l = 0; l < num_labels_; ++l) {

这个,看了4篇了大家不妨自己推一推?不行咱再一起来

同时,在我的知乎专栏也会开始同步更新这个模块,欢迎来交流

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

打一个小广告,我的摄影中的图像基础技术公开课程《AI 程序员码说摄影图像基础》上线了,主要从一个图像处理工程师的角度来说说摄影中的基础技术和概念,欢迎大家订阅交流。

加入我们做点趣事

往期精彩

[caffe解读] caffe从数学公式到代码实现1-导论。

为了压榨CNN模型,这几年大家都干了什么。

[caffe解读] caffe从数学公式到代码实现2-基础函数类

[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss相关推荐

  1. 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大lossz 本节说caffe中常见loss的推导,具体包含下面的cpp. ...

  2. [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积

    今天要讲的就是跟卷积相关的一些layer了 im2col_layer.cpp base_conv_layer.cpp conv_layer.cpp deconv_layer.cpp inner_pro ...

  3. 【caffe解读】 caffe从数学公式到代码实现3-shape相关类

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现3-shape相关类 接着上一篇说,本篇开始读layers下面的一些与blob shape有关的la ...

  4. 【caffe解读】 caffe从数学公式到代码实现5-caffe中的卷积

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积 今天要讲的就是跟卷积相关的一些layer了 im2col_layer.cpp ...

  5. 【caffe解读】 caffe从数学公式到代码实现2-基础函数类

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现2-基础函数类 接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些c ...

  6. 【caffe解读】 caffe从数学公式到代码实现1-导论

    文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现1-导论 真的很多年没有认真写csdn博客了,我回来了 今天开一个新板块,目标是死磕现有的几大机器学 ...

  7. [caffe解读] caffe从数学公式到代码实现3-shape相关类

    接着上一篇说,本篇开始读layers下面的一些与blob shape有关的layer,比如flatten_layer.cpp等,具体包括的在下面: flatten_layer.cpp conv与dec ...

  8. [caffe解读] caffe从数学公式到代码实现2-基础函数类

    接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp. absval_layer.cpp 其中,下面这些layer是不需要反向传播的,大部分都是io类,我们就不讲了 ...

  9. [caffe解读] caffe从数学公式到代码实现1-导论

    新板块说明 今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助. 作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框架是有很大的区别的,而要想走 ...

最新文章

  1. office2003/2007/2010版本降低宏安全设置方法
  2. vs2015添加vc助手
  3. python 多进程 字典,数组
  4. Debian Linux下的Python学习——函数
  5. python限定方法参数类型、返回值类型、变量类型等
  6. Ubuntu系统rm命令删除文件没有提示,怎么办?
  7. iOS多线程的初步研究(十)-- dispatch同步
  8. mysql nosql 同步_使用canal和canal_mysql_nosql_sync同步mysql数据
  9. mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定
  10. 光彩集团小宇智能机器人_【青春关注】集团公司首台智能巡检机器人在我矿上线运行...
  11. selenium无头浏览器
  12. 简述计算机硬盘常见故障及处理方法,常见计算机硬盘故障的解决方法
  13. arpu计算方法、pv、uv、ip的意思
  14. 明月当空照,python3D编程初阶:坐标、模型、纹理与光
  15. 公农历互转js库-solarlunar-es
  16. python selenium 隐藏浏览器_来了!最完美方案!Selenium模拟浏览器如何正确隐藏特征...
  17. Zynq-PS-SDK(4) 之 GIC 配置
  18. 用Endnote在word中插入文献出现{Xu, 1997 #407}等样式的错误的解决方法如下
  19. php函数名命名规范,PHP语言的命名规则
  20. c语言—冒泡排序(详解)

热门文章

  1. 10分钟白嫖我常用的20个在线工具类网站清单。
  2. 一个基于 Spring Boot 的项目骨架,少造轮子!
  3. 算法-动态规划(1)
  4. python牛顿迭代法_python-来自维基百科示例的Gauss-Newton方法的实现
  5. 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
  6. MapReduce进阶:多路径输入输出
  7. 笔记 - Ali cloud ESC 简介
  8. win10 mysql 3534_win10 mysql 5.7.13 服务无法启动 3534
  9. vb 字符串替换_学习VB编程第69天 字符串查找与替换
  10. 从零开始入门 K8s | Kubernetes 调度和资源管理