接上篇:caffe中样本的label一定要从序号0开始标注吗?–caffe学习(15)
A:
1:数学上来说,损失函数loss值和label从0开始还是从1或者100开始是没有直接联系的,以欧式距离损失函数(Euclidean Loss)为例子:

2:铰链损失函数(Hinge Loss)这个loss就是SVM用到的loss。

对于多类的版本中,Crammer and Singer使用这种定义来分类多类:

loss最小化就是尽可能地使得所有和正确类别y差别最大的类别之和最小。WyX就是正确类别的分数Y。这里都没有加入正则化权重W,是为了简单。现在基本都有使用权重正则化来计算loss。
从SVM的分类函数来看我们依然没有看到和类别标号起始数值有关的证明。下面就开始分析caffe中的loss计算方法。
关于算法具体部分参考:http://blog.csdn.net/u014114990/article/details/47802993
WIKI:https://en.wikipedia.org/wiki/Hinge_loss

B:caffe中loss函数代码分析:
首先caffe是支持多个层计算loss的,所以有loss_weight这一个参数,当只有一个loss层时,该层的loss_weight自然为1,如果有两个loss层,权重可以死0.5+0.5或者自己生0.6+0.4之类的:
参考caffe官网中译版:



代码分析:
loss_layer.cpp:

void LossLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {// LossLayers have a non-zero (1) loss by default.if (this->layer_param_.loss_weight_size() == 0) { //看这里this->layer_param_.add_loss_weight(Dtype(1));}
}

这只是初始化,下面看具体的前向计算以Hinge_Loss_layer.cpp为例:

void HingeLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top) {const Dtype* bottom_data = bottom[0]->cpu_data();Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();const Dtype* label = bottom[1]->cpu_data();int num = bottom[0]->num();int count = bottom[0]->count();int dim = count / num;caffe_copy(count, bottom_data, bottom_diff);for (int i = 0; i < num; ++i) {bottom_diff[i * dim + static_cast<int>(label[i])] *= -1;}for (int i = 0; i < num; ++i) {for (int j = 0; j < dim; ++j) {bottom_diff[i * dim + j] = std::max(Dtype(0), 1 + bottom_diff[i * dim + j]);}}Dtype* loss = top[0]->mutable_cpu_data();switch (this->layer_param_.hinge_loss_param().norm()) {case HingeLossParameter_Norm_L1:loss[0] = caffe_cpu_asum(count, bottom_diff) / num;break;case HingeLossParameter_Norm_L2:loss[0] = caffe_cpu_dot(count, bottom_diff, bottom_diff) / num;break;default:LOG(FATAL) << "Unknown Norm";}

可以看到label 仅使用了一次,在:

  for (int i = 0; i < num; ++i) {bottom_diff[i * dim + static_cast<int>(label[i])] *= -1;}

实际上对比上面的公式这里是很容易理解的,从实现的角度也没有看到和label的起始值有关的数据。因此这应该是一个magic,我们使用的时候还是遵照从0开始标号就好。

代码的最后实现了两种归一化函数L1和L2,见下篇分析:
L1归一化和L2归一化范数的详解和区别

caffe中loss函数代码分析--caffe学习(16)相关推荐

  1. 关于机器学习 Machine Learning中loss函数参数正则化的一点思考

    1 致谢 感谢 Andrew Ng教授的讲述! 2 前言 今天在学习机器学习中对loss函数中的参数进行正则化~ 3 关于机器学习中loss函数参数正则化 在机器学习中,有一项防止过拟合的技巧就是(参 ...

  2. 从入门到入土:机器学习part01|python|代码分析|初步学习

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  3. 在SDLC中使用静态代码分析的最佳实践

    http://vultrace.cn更多精彩,尽在个人博客. 文章翻译自ncc group的论文,论文超长预警,请耐心观看. Best Practices for the use of Static ...

  4. vs 2015 C 语言,VS2015中C/C++代码分析

    VS2015中C/C++代码分析 03/31/2015 8 分钟可看完 本文内容 [原文发表时间]:2015/2/24 1:00 PM 来自 Joe Morris & Jim Springfi ...

  5. linux中request_region()函数的分析

    linux中request_region()函数的分析 struct resource ioport_resource = { .name = "PCI IO", .start = ...

  6. SwinTransformer代码中出现的代码知识的学习

    参考大佬 B站大佬:霹雳吧啦Wz视频:12.2 使用Pytorch搭建Swin-Transformer网络 讲解链接:https://www.bilibili.com/video/BV1yg411K7 ...

  7. dqn在训练过程中loss越来越大_强化学习笔记:OpenAI Gym+DQN+Tensorflow2实现

    参考了一些文章,针对OpenAI gym环境,使用tf2.x实现了DQN算法:加上了一些没有太大必要(?)的小功能,比如:自动保存视频,保存训练日志从而利用TensorBoard实现数据可视化,保存和 ...

  8. GPUImage滤镜中的shader代码分析,及自定义滤镜

    from: http://blog.csdn.net/vegerjiangsir/article/details/27172143 GPUImage由于使用GPU,顾其在滤镜染色的时候真正使用的是Op ...

  9. caffe中的batchNorm层(caffe 中为什么bn层要和scale层一起使用)

    caffe中的batchNorm层 链接: http://blog.csdn.net/wfei101/article/details/78449680 caffe 中为什么bn层要和scale层一起使 ...

最新文章

  1. 大数据最清楚王宝强离婚事件到底有多热!
  2. python 大数据学习 遇到的问题,及解决方法。
  3. 如何在 SAP 电商云 Spartacus UI 首页的产品展示里显示视频
  4. C#如何测试代码运行时间
  5. JDK 11:Java序列化的终结开始了吗?
  6. 在Java 8中使用Rhino
  7. 将ERF格式转换成PCAP格式
  8. 苹果Mac定制化App开发神器:​​​​FileMaker
  9. 云计算虚拟化之Docker上如何安装Mongodb?
  10. 解决办法:为什么我的DLL中加载后找不到指定的函数
  11. excel mmult matlab,#excel 减法函数#用excel算两矩阵相乘
  12. php 用户控件,一个使用用户控件(包括组件)的演示-.NET教程,组件控件开发
  13. 2019半年总结——学习与成长
  14. 临床执业助理医师(综合练习)题库【3】
  15. 我“胡汉三”又回来了。
  16. 基于单片机的太阳能热水器系统
  17. 带你体验最新版的DataOps 大数据平台——StreamSets ControlHub,简单到让人发指
  18. RPC-BDY(3)-Netty实现
  19. 我30岁,为高薪转行学Python,第一份工作月薪6000
  20. 多种改变iframe的src地址方法

热门文章

  1. python成语接龙
  2. 运用电脑辅助 对彩票号码 进行 数字分析 — 华东15选5
  3. 小米android手机怎么刷机,刷机如此简单 小米手机四种刷机方法
  4. 【扫描PDF】如何将颜色淡的扫描PDF颜色变深,便于阅读??PDF中文字太淡怎么加深?汇总网上已有的方法,一波小结
  5. 抖音新手常犯的几个雷区,你知道几个?
  6. Typora Syntax
  7. unity网络资源导入
  8. 项目研发管理经验交流
  9. Vue2 —— 项目实战(电影网首页的制作) 附源码
  10. 辅导作业很“崩溃”?猿辅导教你三招告别怒吼式教育