SoftmaxLayer and SoftmaxwithLossLayer 代码解读

简介: SoftmaxLayer and SoftmaxwithLossLayer 代码解读 Wang Xiao     先来看看 SoftmaxWithLoss 在prototext文件中的定义: 1 layer { 2 name: "loss" 3 type: "SoftmaxW...

 

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_;
21 softmax_layer_->SetUp(softmax_bottom_vec_, softmax_top_vec_); 
22
23 has_ignore_label_ = // draw the parameter from layer
24 this->layer_param_.loss_param().has_ignore_label();
25 if (has_ignore_label_) {
26 ignore_label_ = this->layer_param_.loss_param().ignore_label();
27 }
28 if (!this->layer_param_.loss_param().has_normalization() &&
29 this->layer_param_.loss_param().has_normalize()) {
30 normalization_ = this->layer_param_.loss_param().normalize() ?
31 LossParameter_NormalizationMode_VALID :
32 LossParameter_NormalizationMode_BATCH_SIZE;
33 } else {
34 normalization_ = this->layer_param_.loss_param().normalization();
35 }
36 }

 

 

 

 


 

  

  接下来是对输入数据进行 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[0]->CanonicalAxisIndex(this->layer_param_.softmax_param().axis());
 8 outer_num_ = bottom[0]->count(0, softmax_axis_);
 9 inner_num_ = bottom[0]->count(softmax_axis_ + 1);
10 CHECK_EQ(outer_num_ * inner_num_, bottom[1]->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() >= 2) {
16 // softmax output
17 top[1]->ReshapeLike(*bottom[0]);
18 }
19 }

 

  

 

相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 算法
代码的前世今生详细介绍
7月更文挑战第8天
42 4
|
1月前
|
安全
神秘代码
这是针对IDEA 2023.2.4的破解码,允许用户免费激活软件。该破解码包含详细的授权信息,能绕过付费使用限制,实现全面功能解锁。注意,使用此类破解码可能违反相关软件使用协议,并存在安全风险。建议通过官方渠道获取正版软件。
|
4月前
流星雨代码
流星雨代码
|
4月前
|
前端开发 Java C++
一行代码就能完成的事情,为什么要写两行?
一行代码就能完成的事情,为什么要写两行?
|
SQL 人工智能 前端开发
无代码的未来
随着无代码技术越来越成熟,很多web应用已经可以基于无代码平台进行开发。本文分析了4个最流行的无代码平台,并梳理了无代码行业今后可能的发展方向。
415 0
无代码的未来
|
存储 SQL 缓存
10行代码!
10行代码!
193 0
10行代码!
不要傻乎乎的去找不同了,一起来用代码完成“找不同”游戏吧
不要傻乎乎的去找不同了,一起来用代码完成“找不同”游戏吧
551 0
不要傻乎乎的去找不同了,一起来用代码完成“找不同”游戏吧
|
Web App开发 安全 编译器
如何保护你的代码 - Ollvm(一)
如何保护你的代码 - Ollvm(一)
如何保护你的代码 - Ollvm(一)
这一团糟的代码,真的是我写的?!
阿里妹导读:你有没有遇到过这种情况:过几周或者几个月之后,再看到自己写的代码,感觉一团糟,不禁怀疑人生?我们每天都与代码打交道,但当被问道什么是好的代码时,很多人可能会先愣一下,然后给出的回答要么比较空泛,要么比较散,没办法简单明了地概括出来。今天,我们就来说什么是好的代码?
28864 0