[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss
本节说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相关推荐
- 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss
文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大lossz 本节说caffe中常见loss的推导,具体包含下面的cpp. ...
- [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积
今天要讲的就是跟卷积相关的一些layer了 im2col_layer.cpp base_conv_layer.cpp conv_layer.cpp deconv_layer.cpp inner_pro ...
- 【caffe解读】 caffe从数学公式到代码实现3-shape相关类
文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现3-shape相关类 接着上一篇说,本篇开始读layers下面的一些与blob shape有关的la ...
- 【caffe解读】 caffe从数学公式到代码实现5-caffe中的卷积
文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积 今天要讲的就是跟卷积相关的一些layer了 im2col_layer.cpp ...
- 【caffe解读】 caffe从数学公式到代码实现2-基础函数类
文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现2-基础函数类 接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些c ...
- 【caffe解读】 caffe从数学公式到代码实现1-导论
文章首发于微信公众号<与有三学AI> [caffe解读] caffe从数学公式到代码实现1-导论 真的很多年没有认真写csdn博客了,我回来了 今天开一个新板块,目标是死磕现有的几大机器学 ...
- [caffe解读] caffe从数学公式到代码实现3-shape相关类
接着上一篇说,本篇开始读layers下面的一些与blob shape有关的layer,比如flatten_layer.cpp等,具体包括的在下面: flatten_layer.cpp conv与dec ...
- [caffe解读] caffe从数学公式到代码实现2-基础函数类
接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp. absval_layer.cpp 其中,下面这些layer是不需要反向传播的,大部分都是io类,我们就不讲了 ...
- [caffe解读] caffe从数学公式到代码实现1-导论
新板块说明 今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助. 作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框架是有很大的区别的,而要想走 ...
最新文章
- office2003/2007/2010版本降低宏安全设置方法
- vs2015添加vc助手
- python 多进程 字典,数组
- Debian Linux下的Python学习——函数
- python限定方法参数类型、返回值类型、变量类型等
- Ubuntu系统rm命令删除文件没有提示,怎么办?
- iOS多线程的初步研究(十)-- dispatch同步
- mysql nosql 同步_使用canal和canal_mysql_nosql_sync同步mysql数据
- mvvm 自动绑定_ZK的实际应用:MVVM –表单绑定
- 光彩集团小宇智能机器人_【青春关注】集团公司首台智能巡检机器人在我矿上线运行...
- selenium无头浏览器
- 简述计算机硬盘常见故障及处理方法,常见计算机硬盘故障的解决方法
- arpu计算方法、pv、uv、ip的意思
- 明月当空照,python3D编程初阶:坐标、模型、纹理与光
- 公农历互转js库-solarlunar-es
- python selenium 隐藏浏览器_来了!最完美方案!Selenium模拟浏览器如何正确隐藏特征...
- Zynq-PS-SDK(4) 之 GIC 配置
- 用Endnote在word中插入文献出现{Xu, 1997 #407}等样式的错误的解决方法如下
- php函数名命名规范,PHP语言的命名规则
- c语言—冒泡排序(详解)
热门文章
- 10分钟白嫖我常用的20个在线工具类网站清单。
- 一个基于 Spring Boot 的项目骨架,少造轮子!
- 算法-动态规划(1)
- python牛顿迭代法_python-来自维基百科示例的Gauss-Newton方法的实现
- 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
- MapReduce进阶:多路径输入输出
- 笔记 - Ali cloud ESC 简介
- win10 mysql 3534_win10 mysql 5.7.13 服务无法启动 3534
- vb 字符串替换_学习VB编程第69天 字符串查找与替换
- 从零开始入门 K8s | Kubernetes 调度和资源管理