【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss

Caffe学习(六)损失层及其参数设置 机器学习的目的就是通过对训练样本输出与真实值不一致的进行惩罚,得到损失Loss,然后采用一定的优化算法对loss进行最小优化,进而得到合理的网络权值。本文介绍Caffe中含有的常见的LossLayer及其参数设置方法 Caffe的LossLayer主要由6个: (1)ContrastiveLossLayer 对比损失函数主要用来训练siamese网络,改网络为专门处理同时输入两张图像的网 阅读详情

文章首发于微信公众号《与有三学AI》

[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大lossz

本节说caffe中常见loss的推导,具体包含下面的cpp。

multinomial_logistic_loss_layer.cpp
softmax_loss_layer.cpp
euclidean_loss_layer.cpp
sigmoid_cross_entropy_loss_layer.cpp
contrastive_loss_layer.cpp
hinge_loss_layer.cpp
infogain_loss_layer.cpp

 

01 multinomial_logistic_loss_layer.cpp

数学定义

x是输入,y是label,l是loss

上述式只有当样本i属于第k类时,y k=1,其他情况 y k=0,我们计不为0的 y k=y。

forward & backward

forward对所有求和,注意此处没有对图像维度的像素进行归一化,只对batch size维度进行归一化,num就是batchsize,这与下面的softmaxlosslayer是不一样的。

voidMultinomialLogisticLossLayer<Dtype>::Forward_cpu(
const vector<Blob<Dtype>*>& bottom, constvector<Blob<Dtype>*>& top) {
const Dtype* bottom_data = bottom[0]->cpu_data();
const Dtype* bottom_label = bottom[1]->cpu_data();
int num = bottom[0]->num();
int dim = bottom[0]->count() / bottom[0]->num();
Dtype loss = 0;
for (int i = 0; i < num; ++i) {
int label = static_cast<int>(bottom_label[i]);
Dtype prob = std::max( bottom_data[i * dim + label],Dtype(kLOG_THRESHOLD));
loss -= log(prob);
}
top[0]->mutable_cpu_data()[0] = loss / num;
}

backward可以自己去看,很简单就不说了

 

02 softmax_layer.cpp

数学定义

softmax是我们最熟悉的了,分类任务中使用它,分割任务中依然使用它。Softmax loss实际上是由softmax和cross-entropy loss组合而成,两者放一起数值计算更加稳定。

令z是softmax_with_loss层的输入,f(z)是softmax的输出,则

单个像素i的softmax loss等于cross-entropy error如下

展开上式:

在网络中,z是即bottom blob,l(y,z)是top blob,反向传播时就是要根据top blob diff得到bottom blob diff,所以要得到 

下面求loss对z的第k个节点的梯度

可见,传给groundtruth label节点和非groundtruth label是的梯度是不一样的。

forward就不看了,看看backward吧。

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;
}
}
}

Test_softmax_with_loss_layer.cpp

作为loss层,很有必要测试一下,测试也分两块,forward和backward。

Forward测试是这样的,定义了个bottom blob data和bottom blob label,给data塞入高斯分布数据,给label塞入0~4。

blob_bottom_data_(new
Blob<Dtype>(10, 5, 2, 3)),
blob_bottom_label_(new
Blob<Dtype>(10, 1, 2, 3)),

然后分别ingore其中的一个label做5次,最后比较,代码如下。

Dtype accum_loss = 0;
for (int label = 0; label < 5; ++label) {
layer_param.mutable_loss_param()->set_ignore_label(label);
layer.reset(new SoftmaxWithLossLayer<Dtype>(layer_param));
layer->SetUp(this->blob_bottom_vec_,
this->blob_top_vec_);
layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_);
accum_loss += this->blob_top_loss_->cpu_data()[0];
}
// Check that each label was included all but
once.
EXPECT_NEAR(4 * full_loss, accum_loss, 1e-4);

至于backwards,直接套用checker.CheckGradientExhaustive就行,它自己会利用数值微分的方法和你写的backwards来比较精度。

TYPED_TEST(SoftmaxWithLossLayerTest,
TestGradientIgnoreLabel) {
typedef typename TypeParam::Dtype Dtype;
LayerParameter layer_param;
//
labels are in {0, ..., 4}, so we'll ignore about a fifth ofthem
layer_param.mutable_loss_param()->set_ignore_label(0);
SoftmaxWithLossLayer<Dtype> layer(layer_param);
GradientChecker<Dtype> checker(1e-2, 1e-2, 1701);
checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_,
this->blob_top_vec_, 0);
}

 

03 eulidean_loss_layer.cpp

euclidean loss就是定位检测任务中常用的loss。

数学定义:

forward & backward

voidEuclideanLossLayer<Dtype>::Backward_cpu(const
vector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, const
vector<Blob<Dtype>*>& bottom) {
for (int i = 0; i < 2; ++i) {
if (propagate_down[i]) {
const Dtype sign = (i == 0) ? 1 : -1;
const Dtype alpha = sign * top[0]->cpu_diff()[0] /bottom[i]->num();
caffe_cpu_axpby( bottom[i]->count(),  // count
alpha, // alpha
diff_.cpu_data(), // a
Dtype(0), // beta
bottom[i]->mutable_cpu_diff()); // b
}
}
}

testcpp就不说了。

 

04 sigmoid_cross_entropy_loss_layer.cpp

与softmax loss的应用场景不同,这个loss不是用来分类的,而是用于预测概率,所以在loss中,没有类别的累加项。

令第i个节点输入Xi ,输出总loss为l,label为 yi ,则loss定义如下

其中

上式子有个等价转换,这是为了更好的理解caffe 中forward的计算,公式太多我就直接借用了,如果遇到了原作者请通知我添加转载申明。

http://blog.youkuaiyun.com/u012235274/article/details/51361290

反向求导公式如下:

在经过上面的转换后,避开了数值计算不稳定的情况,caffe中的源码是对整个的bottom[0]->count进行计算累加的,没有区分label项。

for (int i = 0; i < bottom[0]->count(); ++i) {
const int target_value = static_cast<int>(target[i]);
if (has_ignore_label_ && target_value ==ignore_label_) {
continue;
}
loss -= input_data[i] * (target[i] - (input_data[i] >=0)) - log(1 + exp(input_data[i] - 2 * input_data[i] *(input_data[i] >= 0)));
++valid_count;
}

反向传播很简单就不看了

 

05 contrastive_loss_layer.cpp

有一类网络叫siamese network,它的输入是成对的。比如输入两张大小相同的图,网络输出计算其是否匹配。所采用的损失函数就是contrastive loss

数学定义:

d就是欧氏距离,y是标签,如果两个样本匹配,则为1,否则为0. 当y=1,loss就是欧氏距离,说明匹配的样本距离越大,loss越大。当y=0,就是与阈值margin的欧式距离,说明不匹配的样本,欧氏距离应该越大越好,超过阈值最好,loss就等于0.

反向传播其实就是分y=1和y=0两种情况下的euclidean loss的反向传导,由于与euclidean
loss非常相似,不再赘述。

 

06 hinge_loss_layer.cpp

这是一个多分类的loss, 也是SVM的目标函数,没有学习参数的全连接层InnerProductLayer+HingeLossLayer就等价于SVM。

数学定义:

这个层的输入bottom[0]是一个N*C*H*W的blob,其中取值任意值,label就是N*1*1*1,其中存储的就是整型的label{0,1,2,…,k}。tnk  相当于SVM中的 XTW

参考博客http://blog.leanote.com/post/braveapple/Hinge-Loss-%E7%9A%84%E7%90%86%E8%A7%A3

假如预测类别数是K个,正确的label是M,预测值为tnk,即是第n个样本对第k类的预测值,那么当k=M时。

当k!=M时

其中p=1,p=2分别对应L1范数和L2范数,以L1为例

Forward

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处乘以-1,然后累加即可。

再看反向梯度求导:

当进行一次forward之后,

bottom_diff=[max(0,1+t0),max(0,1+t1),...,max(0,1−tk),...,max(0,1−tK-1)]

我们现在要求梯度,期望是1+tk>0时为1,1-tk>0时为-1,其他情况为0,

当任意一项1+tk或者1-tk<0时,会有梯度=0。实际上就是求上面向量各自元素的符号,当1+tk>0,sign(1+tk),只是max(0,1−tk)这个应该反过来,当1-tk>0时,sign(tk-1)=-1。

代码如下:

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;
for (int i = 0; i < num; ++i) {
bottom_diff[i * dim + static_cast<int>(label[i])] *= -1;
}
const Dtype loss_weight = top[0]->cpu_diff()[0];
switch (this->layer_param_.hinge_loss_param().norm()) {
case HingeLossParameter_Norm_L1:
caffe_cpu_sign(count, bottom_diff, bottom_diff);
caffe_scal(count, loss_weight / num, bottom_diff); 
break;
case HingeLossParameter_Norm_L2:
caffe_scal(count, loss_weight * 2 / num, bottom_diff);
break;
default: LOG(FATAL) << "Unknown Norm";
}

}

 

07 infogain_loss_layer.cpp

数学定义:

输入bottom_data是N*C*H*W维向量,bottom_label是N*1*1*1维向量,存储的就是类别数。它还有个可选的bottom[2],是一个infogain matrix矩阵,它的维度等于num_of_label * num_of_label。每个通道c预测的是第c类的概率,取值0~1,所有c个通道的概率相加=1。是不是像softMax?

实际上它内部就定义了shared_ptr<Layer<Dtype> >softmax_layer_,用于映射输入。

Loss定义如下:

其中Hln代表H的第ln行,K是所有类别数,如果H是一个单位矩阵,那么只有对角线有值,回到文章开头,这就是multinomial_logistic_loss_layer。当H是一个普通矩阵时,当groundtruth label为k, 

 时,值也可以非零。这样各个类别之间就不存在竞争关系了,后来的mask-rcnn中实际上loss也就是去除了这重竞争关系。

Forward:

void InfogainLossLayer<Dtype>::Forward_cpu(constvector<Blob<Dtype>*>& bottom,
const vector<Blob<Dtype>*>& top) {
softmax_layer_->Forward(softmax_bottom_vec_,softmax_top_vec_);
const Dtype* prob_data = prob_.cpu_data();
const Dtype* bottom_label = bottom[1]->cpu_data();
const Dtype* infogain_mat = NULL;
if (bottom.size() < 3) { infogain_mat =infogain_.cpu_data();
} else { infogain_mat = bottom[2]->cpu_data();}
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>(bottom_label[i * inner_num_ + j]);
if (has_ignore_label_ && label_value ==ignore_label_) {continue;}
DCHECK_GE(label_value, 0);
DCHECK_LT(label_value, num_labels_);
for (int l = 0; l < num_labels_; l++)
{  loss -= infogain_mat[label_value * num_labels_ + l]* log(std::max( prob_data[i *inner_num_*num_labels_ + l * inner_num_ + j],
Dtype(kLOG_THRESHOLD)));}
++count; } }
top[0]->mutable_cpu_data()[0] = loss /get_normalizer(normalization_, count);
if (top.size() == 2) { top[1]->ShareData(prob_); }}

上面与multinomial_logistic_loss_layer的区别就在于每一项乘了infogain_mat[label_value *  num_labels_ + l]。

Backward:

for (int l = 0; l < num_labels_; ++l) {
   bottom_diff[i * dim + l * inner_num_ + j] =prob_data[i*dim + l*inner_num_ +j]*sum_rows_H[label_value] -infogain_mat[label_value * num_labels_ + l];
  }

这个,看了4篇了大家不妨自己推一推?不行咱再一起来

同时,在我的知乎专栏也会开始同步更新这个模块,欢迎来交流

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

打一个小广告,我在gitchat开设了一些课程和chat,欢迎交流。

感谢各位看官的耐心阅读,不足之处希望多多指教。后续内容将会不定期奉上,欢迎大家关注有三公众号 有三AI!

 

caffe中backward过程总结 backward是利用代价函数求取关于网络中每个参数梯度的过程,为后面更新网络参数做准备。求取梯度的过程也是一个矩阵运算的过程,后面会有详细介绍,本身求取梯度的过程并不是很复杂,而且网络中的各层求取梯度的过程都是相似的。下面就按照backward的运行顺序,从最后一层向前介绍caffe的backward的过程。 softmax with loss layer:按理说每一层应该都要求一层梯度, 阅读详情

相关推荐

caffe层解析之softmaxwithloss层

理论caffe中的softmaxWithLoss其实是: softmaxWithLoss = Multinomial Logistic Loss Layer + Softmax Layer 其核心公式为: 其中,其中y^为标签值,k为输入图像标签所对应的的神经元。m为输出的最大值,主要是考虑数值稳定性。 反向传播时: 对输入的zj进行求导得: Caffe中使用首先在Caff

Iriving_shu的博客 1万+

caffe accuracy层以及blob的梳理

基础概念blob的reshapereshape接收的是一个vector的参数,目的是要给这个blob分配相应的内存空间。这个vector参数,表示了不同的维度,一般就是N*C*H*W,如[0]表示N,[1]表示C,等。 直观的解析就是:有N张图,每张图有C个channel,每张图的大小是H*W,如果每个像素都是float类型,那么, 计算总共有多少像素(元素)的公式就是:N*C*H*W,就是bl

brightming的专栏 6550

超级超级细的CLIP官方模型解读及代码逐行讲解

本文详细解析了OpenAI开源的CLIP模型代码架构。文章首先介绍模型概念,包括训练时通过对称损失计算图像-文本相似度,预测时通过余弦相似度匹配最佳文本。随后重点解析各模块代码实现:LayerNorm改进、QuickGELU激活函数、Transformer编码器结构、ViT图像编码器的特征提取过程、文本编码器的掩码机制和特征投影。最后阐述CLIP整体架构如何整合视觉和文本编码器,并详细说明了特征归一化和相似度计算的关键实现。全文通过代码级解读帮助读者深入理解CLIP模型的实现细节。

m0_64595440的博客 2428

[2022-10-13]神经网络与深度学习第3章-前馈神经网络(part3)

[2022-10-13]神经网络与深度学习第3章-前馈神经网络(part3)

江修的博客 892

STM32F103模拟SSI时序解析:实现高精度绝对式编码器位置读取

本文详细解析了如何在STM32F103微控制器上通过软件模拟SSI协议时序,实现高精度绝对式编码器的位置读取。文章从项目驱动出发,深入剖析了SSI通信原理、硬件电平转换连接、核心软件模拟代码实现及关键时序参数调试方法,并提供了使用示波器进行波形对齐与优化的实战指南,为成本敏感型工业控制与机器人项目提供了高性价比的解决方案。

weixin_29196315的博客 143

超详细的YOLOv8项目组成解析:一站式指南了解其架构与组件

最近的更新是关于“Segment ONNX Runtime example”的,意味着它添加了对ONNX运行时的支持,特别是针对模型分割功能的支持。这些文件和文件夹共同工作,以确保 YOLOv8 的文档是全面的、多语言的,并且始终保持最新。这些示例涵盖了从基本的对象检测到更复杂的图像分割和视频处理任务,为开发者提供了丰富的学习资源和应用指导。最近的更新也是关于 ONNX 运行时示例。这些文件夹共同构成了 YOLOv8 的基础框架,从数据处理和模型配置到实际的训练和推理引擎,以及实用工具和高级功能的实现。

CDBmax的博客 1万+

[Caffe]:关于Eltwise layer

Eltwise : element-wiseeltwise layer是caffe提供的按元素操作层。它支持3种基本操作: 1. PROD:按元素乘积 2. SUM:按元素求和(默认) 3. MAX:保存元素大者进行何种操作可以在layer里面通过定义EltwiseOp : x #x:=0,1,2 除此之外,该层还定义了 coeff 参数,该参数只对SUM操作起作用。 最后,ca

cham_3 1万+

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 393

caffe常用层:特殊的Math函数

目录   目录 主要函数 caffe_cpu_gemm 函数 caffe_cpu_gemv 函数 caffe_axpy 函数 caffe_set 函数 caffe_add_scalar 函数 caffe_copy 函数 caffe_scal 函数 caffeine_cup_axpby 函数 caffe_add caffe_sub caf...

perfects110的博客 508

基于单片机的宠物狗智能项圈设计

GPS定位功能:利用GPS模块实时获取宠物的位置,帮助主人追踪宠物的活动轨迹。活动监测:使用加速度传感器监测宠物的活动情况,如运动、休息等,并进行分析。健康监测:集成心率传感器,实时监控宠物的心率,以确保其健康。声音识别功能:通过麦克风捕捉宠物的叫声,检测宠物的状态(如饥饿、疼痛等)。蓝牙/Wi-Fi通信:通过蓝牙或Wi-Fi模块与手机APP或云端平台进行数据交互,实时反馈宠物的状态信息。电池管理:实现低功耗设计,确保设备的续航能力。

2201_76125393的博客 2282

如何用 Claude Code 阅读和理解陌生代码

摘要: 在接手陌生代码时,Claude Code能显著提升理解效率。核心策略是结构化拆解而非逐行阅读: 从整体入手:先扫描目录结构、定位核心模块,建立项目地图; 聚焦关键路径:通过数据流追踪、异常逻辑分析,识别技术债与风险点; 规避常见错误:避免抽象提问或一次性提交全部代码,应分模块精准提问; 高阶应用:可生成逻辑分层图、标记高复杂度区域,甚至定制阅读顺序。 最终目标是通过结构优先的提问策略,将理解周期从数天压缩至数小时。

sg_knight的专栏 1021

Caffe源码:math_functions 解析

caffe源码中的math_functions的具体函数功能分析

ShaowenLin 858

基于XDMA 的PCIE读写DDR

基于XDMA 的PCIE读写DDR 概述:   想实现基于FPGA的PCIe通信,查阅互联网各种转载…基本都是对PCIe的描述,所以想写一下基于XDMA的PCIe通信的实现(PCIe结构仅做简单的描述(笔记),了解详细结构移至互联网)。 实现功能:PC通过PCIE读写DDR,同时用户通过逻辑代码可以读取被写入DDR内的数据(我是通过VIO实现DDR任意地址,任意数据大小的读取。)。 实践实践!!! 说明: 参考文档: PCI Express Base Specification Revision 3.0 P

Crazzy_M的博客 1万+

[caffe解读] caffe从数学公式到代码实现4-认识caffe自带的7大loss

本节说caffe中常见loss的推导,具体包含下面的cpp。multinomial_logistic_loss_layer.cpp01multinomial_logist...

hacker_long的专栏 513

LVGL core disp显示设计(lv_disp.c)

lv_disp.c当前显示页面的配置scr_act在原始的LVGL是以screen的概念存在,但我们还是习惯叫它为一个页面提供获取top_layer、sys_layer、prev_scr图层接口配置主题管理默认的主题管理是递归查找的,实际项目中因此页面的复杂性,虽然也兼容了此主题管理的方案,但还是推荐使用单页面自行管理主题的方案壁纸设置多页面切换的动画支持计算无用户操作时间清理显示缓存。

Bigan(安)的博客 2331

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

caffe源码解读(2)-center_loss_layer.cpp

center_loss公式定义 center_loss_layer.cpp源码解读 center loss,softmax loss在mnist数据集上的对比实验 定义 “Center Loss: simultaneously learning a center for deep features of each class and penalizing the distances

冬后晚晴的博客 943

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

caffe的一些层的功能

附上常用的修改train_val.prototxt训练网络为deploy.prototxt测试网络的链接:点击这里 附上一些常用的且较为详述的链接:点击这里 Slice层:用来将输入张量按照维度进行切分 layer { name: "slice" type: "Slice" bottom: "input" #假设维度:N×5×H*W top: "output...

Ceri的博客 583

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

caffe中的一些特殊层

Reshape layer layer { name: "reshape" //名称:reshape type: "Reshape" //类型:Reshape bottom: "data" //输入层名称:data top: "datax" //输出层名称:datax reshap

竹馨shine的专栏 3385

学习笔记: 源码 multinomial_logistic_loss_layer.cpp 略晓

MultinomialLogisticLossLayer 对数损失函数: L = -log(P(Y|X)) softmax 的损失函数如下: 在处理分类问题的时候,当前一层输出了每一类的概率,那么则可以利用 MultinomialLogisticLossLayer 来计算 loss。 1. forward() template void Multinomia

smallplum123的博客 2322

Caffe源码(一):math_functions 分析

目录目录 主要函数 caffe_cpu_gemm 函数 caffe_cpu_gemv 函数 caffe_axpy 函数 caffe_set 函数 caffe_add_scalar 函数 caffe_copy 函数 caffe_scal 函数 caffeine_cup_axpby 函数 caffe_add caffe_sub caffe_mul caffe_div 函数 caffe_powx caff

seven_first的博客 8万+

Caffe中Loss Layer原理的简单梳理

1.SoftmaxWithLoss 对一对多的分类任务计算多项逻辑斯蒂损失,并通过softmax传递预测值,来获得各类的概率分布。该层可以分解为SoftmaxLayer+MultinomialLogisticLossLayer,但它的梯度计算在数值上更为稳健。在测试时,该层可用SoftmaxLayer替代。 前向传播 bottom: 1.(N×C×H×W)维的预测得分x,N是ba

人工智能 1万+

caffe数学运算

caffe_cpu_gemm C=αATransABTransB+βCC =\alpha A^{TransA}B^{TransB}+\beta CC=αATransABTransB+βC void caffe_cpu_gemm(const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const int M, const int N,...

limengjuhanxin的专栏 2070

caffe学习笔记3.2--前向传播和反向传播

caffe学习笔记3从3.1开始主要翻译一下caffe的官方文档,写的非常好,忍不住要作一下。本篇翻译来自caffe官网的:http://caffe.berkeleyvision.org/tutorial/forward_backward.html 前向传播和反向传播是计算神经网络非常重要的部分。 考虑一个简单的逻辑回归分类问题 前向传播:通过网络的输入计算输出结果的过程,在前向传播中,

thystar的专栏 1万+

softmaxWithLoss Layer

caffe中的softmaxWithLoss其实是: softmaxWithLoss = Multinomial Logistic Loss Layer + Softmax Layer其中: Multinomial Logistic Loss Layer 即为交叉熵代价函数 Softmax Layer其实就是指softmax function(全连接那一步在它前面的fc中实现)示意图如下

z1102252970的专栏 1311

Caffe学习笔记—Caffe反向传播计算

一、反向传播的特点   CNN进行前向传播阶段点,依次调用每个Layer的Forward函数,得到逐层的输出,最后一层与目标函数比较得到损失函数,计算误差更新值,通过反向传播路径层达到第一层,所有的权值层在反向传播结束后一起更新。    二、损失函数   损失层(lossLayer)是CNN的终点,接受两个Blob作为输入,其中一个为CNN的预测值,另一个是真

快乐晓笑 4516

Caffe源码 - SoftmaxWithLossLayer

Softmax with Loss Layer 网络层 type: SoftmaxWithLoss Doxygen Documentation 头文件: ./include/caffe/layers/softmax_loss_layer.hpp CPU 代码: ./src/caffe/layers/softmax_loss_layer.cpp CUDA GPU 代码: ./src/caffe/lay

长风破浪会有时,直挂云帆济沧海 2821
上一篇: 【caffe解读】 caffe从数学公式到代码实现5-caffe中的卷积
下一篇: 【caffe解读】 caffe从数学公式到代码实现3-shape相关类
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言有三

三人行必有AI

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值