SoftmaxLayer and SoftmaxwithLossLayer 代码解读

Wang Xiao


  先来看看 SoftmaxWithLoss 在prototext文件中的定义:

  1. layer {
  2. name: "loss"
  3. type: "SoftmaxWithLoss"
  4. bottom: "fc8"
  5. bottom: "label"
  6. top: "loss"
  7. }

  再看SoftmaxWithLossLayer的.cpp文件:

  

  1. #include <algorithm>
  2. #include <cfloat>
  3. #include <vector>
  4.  
  5. #include "caffe/layers/softmax_loss_layer.hpp"
  6. #include "caffe/util/math_functions.hpp"
  7.  
  8. namespace caffe {
  9.  
  10. template <typename Dtype>
  11. void SoftmaxWithLossLayer<Dtype>::LayerSetUp(
  12. const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
  13. LossLayer<Dtype>::LayerSetUp(bottom, top);
  14. LayerParameter softmax_param(this->layer_param_);
  15. softmax_param.set_type("Softmax");
  16. softmax_layer_ = LayerRegistry<Dtype>::CreateLayer(softmax_param);
  17. softmax_bottom_vec_.clear();
  18. softmax_bottom_vec_.push_back(bottom[0]); // 将bottom[0]存入softmax_bottom_vec_;
  19. softmax_top_vec_.clear();
  20. softmax_top_vec_.push_back(&prob_);   // 将 prob_ 存入 softmax_top_vec_;
  1. softmax_layer_->SetUp(softmax_bottom_vec_, softmax_top_vec_);
  2.  
  3. has_ignore_label_ = // draw the parameter from layer
    this->layer_param_.loss_param().has_ignore_label();
    if (has_ignore_label_) {
    ignore_label_ = this->layer_param_.loss_param().ignore_label();
    }
    if (!this->layer_param_.loss_param().has_normalization() &&
    this->layer_param_.loss_param().has_normalize()) {
    normalization_ = this->layer_param_.loss_param().normalize() ?
    LossParameter_NormalizationMode_VALID :
    LossParameter_NormalizationMode_BATCH_SIZE;
    } else {
    normalization_ = this->layer_param_.loss_param().normalization();
    }
    }

  

  接下来是对输入数据进行 reshape 操作:

  

  1. template <typename Dtype>
  2. void SoftmaxWithLossLayer<Dtype>::Reshape(
  3. const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {
  4. LossLayer<Dtype>::Reshape(bottom, top);
  5. softmax_layer_->Reshape(softmax_bottom_vec_, softmax_top_vec_);
  6. softmax_axis_ =
  7. bottom[]->CanonicalAxisIndex(this->layer_param_.softmax_param().axis());
  8. outer_num_ = bottom[]->count(, softmax_axis_);
  9. inner_num_ = bottom[]->count(softmax_axis_ + );
  10. CHECK_EQ(outer_num_ * inner_num_, bottom[]->count())
  11. << "Number of labels must match number of predictions; "
  12. << "e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
  13. << "label count (number of labels) must be N*H*W, "
  14. << "with integer values in {0, 1, ..., C-1}.";
  15. if (top.size() >= ) {
  16. // softmax output
  17. top[]->ReshapeLike(*bottom[]);
  18. }
  19. }

  

SoftmaxLayer and SoftmaxwithLossLayer 代码解读的更多相关文章

  1. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  2. 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案

    简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...

  3. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

  4. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  5. Jsoup代码解读之五-实现一个CSS Selector

    Jsoup代码解读之七-实现一个CSS Selector 当当当!终于来到了Jsoup的特色:CSS Selector部分.selector也是我写的爬虫框架webmagic开发的一个重点.附上一张s ...

  6. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  7. Jsoup代码解读之三-Document的输出

    Jsoup代码解读之三-Document的输出   Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...

  8. Jsoup代码解读之一-概述

    Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学 ...

  9. Jsoup代码解读之二-DOM相关对象

    Jsoup代码解读之二-DOM相关对象   之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多 ...

随机推荐

  1. SharePoint 2013 开发——Provider-hosted APP准备工作

    博客地址:http://blog.csdn.net/FoxDave 后续的内容我们来一步一步开发一个SharePoint Porvider-hosted APP,本篇主要介绍一些准备工作. Sha ...

  2. 我们都遇到过的 Replace Blank Space

    题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 分析: 看到这个题目,我们都会有 ...

  3. Core Animation系列之CADisplayLink

    一直以来都想好好学习下CoreAnimation,奈何涉及的东西太多,想要一次性全部搞定时间上不允许,以后会断断续续的补全.最近项目里用到了CADisplayLink,就顺便花点时间看了看. 一.简介 ...

  4. uitabbarcontroller中 在设置tab bar item的image属性后不显示问题

    开始使用ios中的UITabBarController,在给Tab Bar Item设置自定义图片的时候,遇到了问题 按照如下配置: 出来的结果确是: 实际上test24.png应该是: 纠结了很久, ...

  5. 北大poj-1001

    Description Problems involving the computation of exact values of very large magnitude and precision ...

  6. (spring-第12回【IoC基础篇】)JavaBean的属性编辑器

    在spring实例化bean的最后阶段,spring利用属性编辑器将配置文件中的文本配置值转换为bean属性的对应值,例如: 代码0011 <bean id="car" cl ...

  7. 【LeetCode OJ】Best Time to Buy and Sell Stock II

    Problem Link: http://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/ We solve this prob ...

  8. 换个心境搞IT,在IT职场如何打拼?

    刚进入IT这行时,我也是从程序员做起.尤其是前两三个月里,那种感觉就像时时刻刻处于备战状态一样.我是一个在对自己的要求方面有洁癖的人,在没有任何经验的状态下,只有坚持苦干,把下发的每件编程任务做好,才 ...

  9. magento中比较好的博客

    magento web-开发   http://www.magentofront-end.com/magentomuban/category/web-frontend 水水博客专栏   http:// ...

  10. python模块的安装

    1.下载所需模块 2.解压到一个目录 3.window下打开cmd 4.切换到模块setup.py目录 5.执行python setup.py install安装 前提是安装了python,并且配置了 ...