搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
weixin_40725706
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
CRM客户关系管理系统UI设计作品_crm ui
2
次世代手游美术资源优化干货分享_pc移植手游怎么压缩美术资源
3
Prometheus监控K8S
4
win10 快捷键大全(集合)_win10快捷键大全表
5
【学习】FaceForensics++: Learning to Detect Manipulated Facial Images
6
OpenCV安装_安装opencv
7
OpenAI开发系列(二):大语言模型发展史及Transformer架构详解_迎接大模型时代:大模型发展简史及攻略
8
win+快捷键(常用)
9
cassandra java 例子_Cassandra教程:Java API 简单例子
10
.net core 图片合并,图片水印,等比例缩小,SixLabors.ImageSharp
当前位置:
article
> 正文
Caffe源码解读(一)------loss层之softmax_loss_layer.cpp
作者:weixin_40725706 | 2024-02-23 03:27:18
赞
踩
softmax_loss_layer
这几天需要自己写个loss层,因此把caffe源码研读了下,在此记录下经验,方便后人以及自己日后复习。
首先看看caffe前向传播的工作流程,即net.cpp中的ForwardFromTo函数:
可以看到,该函数通过一个for循环来对每一个layer执行前向传播传播。具体的传播函数在layer.hpp中可以找到:
可以看到在这个函数中,最主要的就是执行了Reshape和Forward_cpu函数,剩下的就是对数据的一些处理,我们暂时先不用管它。然后由于Reshape和Forward_cpu都是虚函数,都是由具体的子类来实现的,即softmax_loss_layer.cpp中。接下来我们仔细看看softmax_loss_layer.cpp:
namespace caffe { template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top);
LayerParameter softmax_param(this->layer_param_); softmax_param.set_type("Softmax");
//softmax loss涉及到两层计算,第一层是通过softmax函数计算出每一个分类的概率,第二层
//则是通过概率计算出最终的损失,在caffe中是将这两步操作分开在了两层中,分别是softmax_layer
//和softmax_loss_layer。下面就是创建softmax_layer来进行概率的计算
softmax_layer_ = LayerRegistry<Dtype>::CreateLayer(softmax_param);
softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); softmax_top_vec_.clear(); softmax_top_vec_.push_back(&prob_); softmax_layer_->SetUp(softmax_bottom_vec_, softmax_top_vec_); has_ignore_label_ = 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(); } } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Reshape( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); softmax_layer_->Reshape(softmax_bottom_vec_, softmax_top_vec_); softmax_axis_ = bottom[0]->CanonicalAxisIndex(this->layer_param_.softmax_param().axis()); outer_num_ = bottom[0]->count(0, softmax_axis_); inner_num_ = bottom[0]->count(softmax_axis_ + 1); CHECK_EQ(outer_num_ * inner_num_, bottom[1]->count()) << "Number of labels must match number of predictions; " << "e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), " << "label count (number of labels) must be N*H*W, " << "with integer values in {0, 1, ..., C-1}."; if (top.size() >= 2) { // softmax output top[1]->ReshapeLike(*bottom[0]); } } template <typename Dtype> Dtype SoftmaxWithLossLayer<Dtype>::get_normalizer( LossParameter_NormalizationMode normalization_mode, int valid_count) { Dtype normalizer; switch (normalization_mode) { case LossParameter_NormalizationMode_FULL: normalizer = Dtype(outer_num_ * inner_num_); break; case LossParameter_NormalizationMode_VALID: if (valid_count == -1) { normalizer = Dtype(outer_num_ * inner_num_); } else { normalizer = Dtype(valid_count); } break; case LossParameter_NormalizationMode_BATCH_SIZE: normalizer = Dtype(outer_num_); break; case LossParameter_NormalizationMode_NONE: normalizer = Dtype(1); break; default: LOG(FATAL) << "Unknown normalization mode: " << LossParameter_NormalizationMode_Name(normalization_mode); } // Some users will have no labels for some examples in order to 'turn off' a // particular loss in a multi-task setup. The max prevents NaNs in that case. return std::max(Dtype(1.0), normalizer); } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // The forward pass computes the softmax prob values. softmax_layer_->Forward(softmax_bottom_vec_, softmax_top_vec_); const Dtype* prob_data = prob_.cpu_data(); const Dtype* label = bottom[1]->cpu_data(); int dim = prob_.count() / outer_num_; int count = 0; Dtype loss = 0; for (int i = 0; i < outer_num_; ++i) { for (int j = 0; j < inner_num_; j++) { const int label_value = static_cast<int>(label[i * inner_num_ + j]); if (has_ignore_label_ && label_value == ignore_label_) { continue; } DCHECK_GE(label_value, 0); DCHECK_LT(label_value, prob_.shape(softmax_axis_)); loss -= log(std::max(prob_data[i * dim + label_value * inner_num_ + j], Dtype(FLT_MIN))); ++count; } } top[0]->mutable_cpu_data()[0] = loss / get_normalizer(normalization_, count); if (top.size() == 2) { top[1]->ShareData(prob_); } } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); const Dtype* prob_data = prob_.cpu_data(); caffe_copy(prob_.count(), prob_data, bottom_diff); const Dtype* label = bottom[1]->cpu_data(); int dim = prob_.count() / outer_num_; int count = 0; for (int i = 0; i < outer_num_; ++i) { for (int j = 0; j < inner_num_; ++j) { const int label_value = static_cast<int>(label[i * inner_num_ + j]); if (has_ignore_label_ && label_value == ignore_label_) { for (int c = 0; c < bottom[0]->shape(softmax_axis_); ++c) { bottom_diff[i * dim + c * inner_num_ + j] = 0; } } else { bottom_diff[i * dim + label_value * inner_num_ + j] -= 1; ++count; } } } // Scale gradient Dtype loss_weight = top[0]->cpu_diff()[0] / get_normalizer(normalization_, count); caffe_scal(prob_.count(), loss_weight, bottom_diff); } } #ifdef CPU_ONLY STUB_GPU(SoftmaxWithLossLayer); #endif INSTANTIATE_CLASS(SoftmaxWithLossLayer); REGISTER_LAYER_CLASS(SoftmaxWithLoss); }
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/weixin_40725706/article/detail/133342
推荐阅读
article
YOLOv4
中常见CV学术名词说明(一)【
AP
/
anchor
-
base
/
anchor
-
free
/1-...
学术名词汇总【1】 MS COCO
AP
是什么意思?【2】
AP
50什么意思【3】
anchor
-
base
/
anchor
...
赞
踩
article
Tensorflow2
加载别人模型
权重
失败时的一种解决方法:每一层分别设置值_
valueerror
...
有时自己建立模型导入别人模型参数时会因为版本等各个问题导致导入失败,这时可以一层一层的给网络赋值
权重
。本人在加载某个模型...
赞
踩
article
【
unity
实践记录】
动画
层的顺序和混合模式
Override
/
Additive
_
unity
laye...
层的优先级是按顺序从上到下的。层设置为override将始终覆盖先前的层(如果层有遮罩,则基于其遮罩)。基础层权重始终为...
赞
踩
article
linux
-
caffe
-gpu 编译注意_
undefined
reference
to `
cblas
...
caffe
支持python2.x所以这里,重新安装了Ancona2,将环境变量改为export PATH=/home/d...
赞
踩
article
Caffe
、
TensorFlow
、
MXnet
三个开源库
对比
+主流分类
模型
对比
_基于tensorflo...
Caffe
、
TensorFlow
、
MXnet
三个开源库
对比
+主流分类
模型
对比
库名称 开发语言 支持接口 安装...
赞
踩
article
深度学习
Imagenet
caffe
AlexNet
实验步骤_
fillcnn
实验室
入口
使用
教程...
1 论文:ImageNet Classification with Deep Convolutional Neural...
赞
踩
article
Cassandra
源码解析 6:
Storage
Engine
(DB Layer)_cassan...
原理http://thoss.org.cn/mediawiki/index.php/
Cassandra
_data_mod...
赞
踩
article
【
YOLO
系列
result
中
的
map
、
loss
、pr、F1绘图】根据
v5
、
v8
、v7
训练
后生成
的
re...
【代码】【
YOLO
系列绘图】根据
v5
、
v8
、v7
训练
后生成
的
result
文件用
matplotlib
进行绘图。_怎么根据y...
赞
踩
article
【机器学习】
单细胞
-
ZINB
loss
(零膨胀负
二项
分布
)_
zinb
分布
...
单细胞
RNA测序(single-cell RNA-seq,scRNA-seq)数据是非常有特点的数据,具有很高的稀疏性(...
赞
踩
article
计算机
视觉论文-2021-06-29_interflow: aggregating
multi
-la...
本专栏是
计算机
视觉方向论文收集积累,时间:2021年6月29日,来源:paper digest欢迎关注原创公众号【
计算机
...
赞
踩
article
tensorflow2
+
dataset
+
multi
loss
多
输出
任务 匹配 多
loss
_
tf
的多...
之前提过在model的fit中使用
dataset
参考链接:https://blog.csdn.net/qq_24677...
赞
踩
article
keras
自定义
回调
函数
查看
训练
的
loss
和
accuracy
_
keras
loss
accuracy
...
前言:
keras
是一个十分便捷的开发框架,为了更好的追踪网络
训练
过程中的损失
函数
loss
和准确率
accuracy
,我们有...
赞
踩
article
【
Pytorch
学习】-- 模型参数
更新
--
Loss
Function
&
Optimizer
_p...
Pytorch
学习_
pytorch
多个损失怎么
更新
pytorch
多个损失怎么
更新
...
赞
踩
article
caffe
的
损失
函数
loss
原文解析-
多个
损失
函数
loss
网络
搭建_
caffe
多个
损失
...
caffe
的原始的
loss
的英文描述:http://
caffe
.berkeleyvision.org/tutorial/...
赞
踩
article
caffe
loss
损失权重问题
_
caffe
loss
_
weight
...
loss
有一个细节问题就是Loss
weight
s(损失权重),用来表征不同Layer产生的
loss
的重要性,Layer...
赞
踩
article
caffe
loss
_
loss
1+\
loss
2...
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体...
赞
踩
article
Caffe
损失层中
loss
_
weight
如何存储?
_
caffe
loss
_
weight
...
一个网络中如果存在多个损失层的话,需要给每个损失层加上
loss
_
weight
参数,不加的话默认为1.0。 但是
loss
_
...
赞
踩
article
caffe
loss
层...
在
caffe
中,默认的以
loss
结尾的layer可以作为
loss
层,但是中间的层同样可以作为
loss
层.原因是这样的:有...
赞
踩
article
Caffe
学习:
Loss
_
caffe
loss
应该
是
多少啊...
Caffe
学习:
Loss
_
caffe
loss
应该
是
多少啊
caffe
loss
应该
是
多少啊 ...
赞
踩
article
Caffe
中
Loss
Layer
原理的简单梳理_
logistic
loss
layer
...
1.SoftmaxWith
Loss
对一对多的分类任务计算多项逻辑斯蒂损失,并通过softmax传递预测值,来获得各类的概...
赞
踩
相关标签
算法
计算机视觉
机器学习
深度学习
tensorflow2
权重加载
动画
unity
caffe
alexnet
cassandra
layer
filter
存储
header
table
matplotlib
YOLO
python
概率论
人工智能
keras回调函数
keras的Callbacks
keras查看训练的loss和acc