caffe源码学习:softmaxWithLoss

在caffe中softmaxwithLoss是由两部分组成,softmax+Loss组成,其实主要就是为了caffe框架的可扩展性。

表达式(1)是softmax计算表达式,(2)是sfotmaxLoss的计算损失表达。在caffe中是单独的计算每层的输入和输出,然后再进行向后传递data结果和向前传递diff的结果。

caffe中softmax的计算:

如上所示;在reshape阶段主要是进行相关参数维度的设定。softmax_axis主要是制定从哪个维度开始切,默认是1.后面主要是初始化了两个变量,sum_multiplier_和scale_局部变量的初始化。sum_multiplier_的形状是channel的大小,一般主要是通过矩阵乘法来实现每个feature map相对应的坐标数据进行相加或者相减或者其他的操作。scale通常情况下被用来当作临时的缓冲变量。这两个变量的使用在caffe中到处可见。接下来就是forward_cpu部分的代码。

首先还是获取top和bottom的data,把bottom的data中的数据拷贝给top,以后就直接在top中进行计算。另外在caffe中,dim变量表示的C*W*H,spatial_dim 标识的是W*H。

在上面首先是outer_num_样本数据中输入softmax的数据进行一个‘归一化’操作,大红色方框是为了找出当前instance中输入softmax的特征中的那个最大的数值,然后再减去那个最大数值防止产生数值计算方面的问题(例如在mnist数据集中,outer_num_是128代表的是batch的大小,inner_num_是1,这里的softmax前面链接的是inner product层,所以spatial_dim和inner_num的大小均为1,dim的大小是10,scale_data中其实也只有一个数,虽然caffe_copy之后有两行循环,其实由于inner_num是1,也就一行循环). 计算出最大的数值,然后把那个最大是数值乘以sum_multiplier_,就从1个数变成了C个数。继而做exp,把结果存放到topdata,然后把全部channel的数据求和(求和caffe使用矩阵和向量的乘法进行计算)存放到scale_data,形状是inner_num_,也就是W*H(其实就是1*1),最后就是除以求和结果啦。这么多的语句也就描述了表达式(1). 最主要的是考虑到了数值计算中存在的问题。

下面就应该是softmaxWithLoss计算损失;

上面是softmaxWithLoss的set函数,可以和很清楚地看到在初始化完成softmax_param这个参数之后,直接把type设置成了softmax,然后又通过工厂函数创建softmaxlayer,继而进行Set_up函数。可以看出softmaxWithLoss是内部创建了一个softmaxlayer。

继续后面主要就是检查当前layer是否设定不对某个label进行计算Loss,也就是说,在mnist中有10个class,但是我只想对12345678进行分类,那就设定ignore_label为9.这个时候遇到标签是9的就不计算Loss。注意protobuf中没有设定默认的数值,has_xxx就返回false,只有设定了数值,才会true。后面的norm是为ignore服务的。

接下来的reshape函数也没啥用处,就是设定了三个变量。softmax_axis_=1,outer_num_=128,inner_num_=1.需要注意的是outer_num_ * inner_num_必须和bottom[1]->count()给定的lable数相同。也就是说当softmax前面接inner product的时候,每个lable对应的是instance对应的类别(一个数),但是当softmax前面是卷积层的时候,每个label就不是一个数,而是一个矩阵,对应着每个 feature map中每个像素值的分类。下面就是计算Loss:

这里寿面是计算softmax_layer_的forward函数,softmax_top_vec_其实是prob_的一个引用。prob_data的大小是N*C*1*1.static_cast<int>(label[i * inner_num_ + j])是从对应的instance中取出相对应的标签。如果当前的label和ignore label相同,那么就不计算Loss损失,这样就存在问题,假如128个instance中有10个不计算Loss,那么最终在计算Loss的平均的时候,是除以多少呢?这就用到了norm。count在这里统计我们计算了多少个instance的Loss数值。prob_data[i * dim + label_value * inner_num_ + j] dim是10,label_value是instance的标签来当作index来从prob中取数据(该instance的分类结果),j是0,因为W=H=1。

get_normalizer在VAILD模式下会返回我们计算了多少个Loss的个数,也就是count。这个时候当前batch的Loss就已经放回到top[0]中去了。下一步要计算的就是Loss的反向传播。

caffe源码学习:softmaxWithLoss前向计算相关推荐

  1. caffe源码学习——1.熟悉protobuf,会读caffe.proto

    要想学习caffe源码,首当其冲的要阅读的,就是caffe.proto这个文件.它定义了caffe中用到的许多结构化数据. caffe采用了Protocol Buffers的数据格式. 那么,Prot ...

  2. CAFFE源码学习之优化方法solver

    一.前言 solver就是来计算损失函数最小化的优化方法,在caffe中,提供了六种不同的优化方法: (1)SGD: (2)AdaGrad: (3)AdaDelta: (4)Adam: (5)RMSP ...

  3. 深度学习(八)caffe源码学习-未完待续

    本文主要详细讲解caffe的直接调用方法. 一.训练相关 #!/usr/bin/env sh TOOLS=../cafferead/build/tools $TOOLS/caffe train --s ...

  4. Caffe 源码 - BatchNorm 层与 Scale 层

    batch norm layer & scale layer 简述 Batch Normalization 论文给出的计算: 前向计算: 后向计算: BatchNorm 主要做了两部分: [1 ...

  5. caffe源码c++学习笔记

    转载自:深度学习(七)caffe源码c++学习笔记 - hjimce的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hjimce/article/details/ ...

  6. 深度学习(七)caffe源码c++学习笔记

    caffe源码c++学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/48933845 作者:hjimce 一.预测分类 最近几天为了希望深入 ...

  7. 深度学习框架Caffe源码解析

    作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂.  原文:深度学习框架Caffe源码解析  欢迎技术投稿. ...

  8. caffe源码深入学习6:超级详细的im2col绘图解析,分析caffe卷积操作的底层实现

       在先前的两篇博客中,笔者详细解析了caffe卷积层的定义与实现,可是在conv_layer.cpp与base_conv_layer.cpp中,卷积操作的实现仍然被隐藏,通过im2col_cpu函 ...

  9. Caffe源码中Net文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/net.hpp文件的内容: ...

最新文章

  1. 你就是你自己paper最好的审稿人:宾大苏炜杰提出peer review新机制
  2. GNU make manual 翻译(二十六)
  3. linux字符驱动头文件路径,Linux 字符设备驱动例子
  4. matplotlib学习笔记.CookBook
  5. VB 判断图片文件的类型格式
  6. c语言求ab的最大公约数,C语言中如何调用函数求最大公约数和最小公倍数
  7. js禁止中文输入 最简洁的【禁止输入中文】
  8. ps人物换脸移花接木
  9. 计算机桌面ie图标无法删除,桌面IE浏览器图标无法删除怎么办
  10. php7关闭缓存、禁用缓存
  11. 音视频数据处理入门:AAC音频码流解析
  12. 熔断机制什么意思_熔断机制是什么意思 股市熔断是什么意思
  13. 西门子PLC1200模拟量功能案例
  14. 怎么把qlv格式转换成mp4?快速转换qlv格式的方法
  15. Nginx+Tomcat负载均衡和动静分离理论实操详解来袭!
  16. Python全栈(五)Web安全攻防之2.信息收集和sqlmap介绍
  17. sql性能问题start with
  18. CPC广告业务架构总结
  19. svga文件预览_SVGA文件格式——SVGA动画制作和文件转换
  20. WinForm DevExpress使用-(ChartControl控件绘制图表)

热门文章

  1. 渗透前期学习资源分享
  2. 在《王者荣耀》来聊聊游戏的帧同步
  3. 本题要求实现一个函数,输出n行空心的数字金字塔。
  4. Python之字符串源码解析
  5. rpm -e卸载mysql_rpm
  6. 软件对硬盘性能测试,硬盘性能检测详细图文教程
  7. android glide圆形图片,Android Glide加载图片成圆形
  8. win10无法更新计算机的启动配置,电脑升级win10后一开机关机总是显示正在配置更新请不要关闭您的计算机...
  9. 目标检测,FFmpeg中第一个基于深度学习模型的视频分析功能
  10. 疫情之下,互联网产品逆势爆发