【caffe解读】 caffe从数学公式到代码实现2-基础函数类

如何在Caffe中配置每一个层的结构 最近刚在电脑上装好Caffe,由于神经网络中有不同的层结构,不同类型的层又有不同的参数,所有就根据Caffe官网的说明文档做了一个简单的总结。 1. Vision Layers 1.1 卷积层(Convolution) 类型:CONVOLUTION 例子 layers { name: "conv1" type: CONVOLUTION bottom: "data" 阅读详情

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

[caffe解读] caffe从数学公式到代码实现2-基础函数类

接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。

absval_layer.cpp
accuracy_layer.cpp
argmax_layer.cpp
base_conv_layer.cpp
base_data_layer.cpp
batch_norm_layer.cpp
batch_reindex_layer.cpp
bias_layer.cpp
bnll_layer.cpp
concat_layer.cpp
contrastive_loss_layer.cpp
conv_layer.cpp
crop_layer.cpp
cudnn_conv_layer.cpp
cudnn_lcn_layer.cpp
cudnn_lrn_layer.cpp
cudnn_pooling_layer.cpp
cudnn_relu_layer.cpp
cudnn_sigmoid_layer.cpp
cudnn_softmax_layer.cpp
cudnn_tanh_layer.cpp
data_layer.cpp
deconv_layer.cpp
dropout_layer.cpp
dummy_data_layer.cpp
eltwise_layer.cpp
elu_layer.cpp
embed_layer.cpp
euclidean_loss_layer.cpp
exp_layer.cpp
filter_layer.cpp
flatten_layer.cpp
hdf5_data_layer.cpp
hdf5_output_layer.cpp
hinge_loss_layer.cpp
im2col_layer.cpp
image_data_layer.cpp
infogain_loss_layer.cpp
inner_product_layer.cpp
input_layer.cpp
log_layer.cpp
loss_layer.cpp
lrn_layer.cpp
lstm_layer.cpp
lstm_unit_layer.cpp
memory_data_layer.cpp
multinomial_logistic_loss_layer.cpp
mvn_layer.cpp
neuron_layer.cpp
parameter_layer.cpp
pooling_layer.cpp
power_layer.cpp
prelu_layer.cpp
recurrent_layer.cpp
reduction_layer.cpp
relu_layer.cpp
reshape_layer.cpp
rnn_layer.cpp
scale_layer.cpp
sigmoid_cross_entropy_loss_layer.cpp
sigmoid_layer.cpp
silence_layer.cpp
slice_layer.cpp
softmax_layer.cpp
softmax_loss_layer.cpp
split_layer.cpp
spp_layer.cpp
tanh_layer.cpp
threshold_layer.cpp
tile_layer.cpp
window_data_layer.cpp

其中,下面这些layer是不需要反向传播的,大部分都是io类,我们就不讲了,自己去看。

threshold_layer.cpp
accuracy_layer.cpp
argmax_layer.cpp
data_layer.cpp
image_data_layer.cpp
input_layer.cpp
window_data_layer.cpp
parameter_layer.cpp
memory_data_layer.cpp
dummy_data_layer.cpp
hdf5_data_layer.cpp
hdf5_output_layer.cpp
neuron_layer.cpp
silence_layer.cpp
reshape_layer.cpp
rnn_layer.cpp
base_data_layer.cpp

剩下的就是要讲的,我们先从官方的开始看,后面再看自己写的以及一些开源的。这些layers大概有这么几大类,基础数学函数类,blob shape操作类,loss类。

本节先看一些基础函数类的layer,都只有一个输入,一个输出。注意其中有一些是容许inplace 的layer,有一些是不容许的。所谓inplace,输入输出共用一块内存,在layer的传播过程中,直接覆盖,省内存。Caffe在开源框架中,是比较占内存的了。

 

01 absval_layer.cpp

数学定义:

由于这是第一个例子,我们说的详细些;

Forward:

template <typename Dtype>
void AbsValLayer<Dtype>::Forward_cpu(
const vector<Blob<Dtype>*>&
bottom, const vector<Blob<Dtype>*>& top) {
const int count = top[0]->count();
Dtype* top_data = top[0]->mutable_cpu_data();
caffe_abs(count, bottom[0]->cpu_data(),
top_data);
}

其中,count是blob的size,等于N*C*H*W,bottom[0]是输入x,top[0]是输出f(x),利用mutable_cpu_data来写入,cpu_data来读取。

Backward:

template <typename Dtype>
void AbsValLayer<Dtype>::Backward_cpu(const
vector<Blob<Dtype>*>& top,
const vector<bool>&
propagate_down, const vector<Blob<Dtype>*>&bottom) {
const int count = top[0]->count();
const Dtype* top_diff = top[0]->cpu_diff();
if (propagate_down[0]) {
const Dtype* bottom_data = bottom[0]->cpu_data();
 Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
 caffe_cpu_sign(count, bottom_data, bottom_diff);
 caffe_mul(count, bottom_diff, top_diff,
bottom_diff);
}
}

根据梯度下降法和链式法则,

一次标准的梯度更新过程如下,wt+1=wt+Δwt,对于sgd算法,其中 wt=−η⋅gt ,w为参数,t为时序,Δ为更新量,η为学习率,g为梯度

其中梯度g就是

在backward中,我们只需要计算出即可,至于上面的符号,学习率等在其他地方处理,其实就是

其中其实top_diff,就是对应:

const Dtype* top_diff = top[0]->cpu_diff();

在这里我们知道了,cpu_data就是bottom的data,而cpu_diff就是它存储的梯度,有疑问可以返回上一篇。

propagate_down是一个参数,用于控制是否容许梯度下传的,

caffe_cpu_sign(count, bottom_data, bottom_diff);实际上就是计算了梯度,

再利用caffe_mul(count, bottom_diff, top_diff,bottom_diff);

就OK了

没有对应的test文件,就不解析了。

 

02 exp_layer.cpp

看下caffe 关于其参数的定义:

数学定义:

// Message that stores parameters used by ExpLayer
message ExpParameter {
// ExpLayer computes
outputs y = base ^ (shift + scale * x), for base > 0.
// Or if base is set to
the default (-1), base is set to e,
// so y = exp(shift + scale * x).
optional float base = 1
[default = -1.0];
optional float scale = 2
[default = 1.0];
optional float shift = 3
[default = 0.0];

从下面的setuplayer中可以看出,如果base不是-1,则必须是大于0的数,也就是-2,-3等是不支持的。

const Dtype base = this->layer_param_.exp_param().base();
if (base != Dtype(-1)) {
 CHECK_GT(base, 0) << "base must be strictlypositive.";
}

当base=-1,也就是默认时f(x)=e^{αx+β},就是我们熟悉的指数函数了

还记得指数函数求导吧;

 

03 log_layer.cpp

数学定义:

同样base=-1是默认值,否则必须大于0

 

04 power_layer.cpp

数学定义:

梯度也是很简单的,不过为了提高计算效率,caffe尽可能的复用了中间结果,尤其是在反向传播的时候,分两种case,完整的计算大家还是去看代码,这里粘代码太难受了。

 

05 tanh_layer.cpp

数学定义:

这一次咱们遇到有test layer,仔细说说。

在caffe/test目录下test_tanh_layer.cpp

所谓测试,就是要验证网络的正向和反向。

这个文件是这样测试的:

先定义了个tanh_naïve函数,然后利用GaussianFille初始化一个bottom,将其通过forward函数,把出来的结果和tanh_naïve的结果进行比对,完整代码如下,感受一下:

void TestForward(Dtype filler_std) {
 FillerParameter filler_param;
 filler_param.set_std(filler_std);
 GaussianFiller<Dtype> filler(filler_param);
 filler.Fill(this->blob_bottom_);

 LayerParameter layer_param;
 TanHLayer<Dtype> layer(layer_param);
 layer.SetUp(this->blob_bottom_vec_,
this->blob_top_vec_);
 layer.Forward(this->blob_bottom_vec_,
this->blob_top_vec_);
// Now, check values
const Dtype* bottom_data = this->blob_bottom_->cpu_data();
const Dtype* top_data = this->blob_top_->cpu_data();
const Dtype min_precision = 1e-5;
for (int i = 0; i < this->blob_bottom_->count();
++i) {
   Dtype expected_value =
tanh_naive(bottom_data[i]);
   Dtype precision = std::max(
     Dtype(std::abs(expected_value * Dtype(1e-4))),
min_precision);
   EXPECT_NEAR(expected_value, top_data[i],
precision);
 }
}

EXPECT_NEAR函数就会检查梯度是否正确,如果过不了,就得回去看forward函数是否有错了。

反向验证:

void TestBackward(Dtype filler_std) {
 FillerParameter filler_param;
 filler_param.set_std(filler_std);
 GaussianFiller<Dtype> filler(filler_param);
 filler.Fill(this->blob_bottom_);

 LayerParameter layer_param;
 TanHLayer<Dtype> layer(layer_param);
 GradientChecker<Dtype> checker(1e-2, 1e-2, 1701);
 checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_,
this->blob_top_vec_);
}

其中GradientChecker(const Dtype stepsize, const Dtypethreshold,

const unsigned int seed = 1701, const Dtype kink =0.,const Dtype kink_range = -1)

可以设置stepwise和误差阈值,CheckGradientEltwise是逐个像素检查。

 

06 sigmoid_layer.cpp

数学定义:

 

07 relu_layer.cpp

数学定义:

其中negative_slope a默认=0,退化为f(x)=max(x,0)

上面的relu其实包含了我们常说的relu和ReLU和LeakyReLU

 

08 prelu_layer.cpp

与LeakyReLU不同的是,负号部分的参数a是可学习的并不固定。所以,在反向传播时,该参数需要求导,默认a=0.25。

数学定义

此处的a是个变量。

首先,对x也就是bottom的求导

代码如下

if (propagate_down[0]) {
Dtype* bottom_diff = bottom[0]->mutable_cpu_diff();
for (int i = 0; i < count; ++i) {
int c = (i / dim) % channels / div_factor;
bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0)
+ slope_data[c] * (bottom_data[i] <= 0));
}
}

而scale参数的求导,则会稍微复杂些,如下

if (this->param_propagate_down_[0]) {
 Dtype* slope_diff = this->blobs_[0]->mutable_cpu_diff();
for (int i = 0; i < count; ++i) {
int c = (i / dim) % channels / div_factor;
   slope_diff[c] += top_diff[i] * bottom_data[i]
* (bottom_data[i] <= 0);
 }
}

因为对于blob中第i个数据, 当i不等于k时,yi 与xk是没有关系的,但是a却与blob中的所有数据有关系。

我们重新表述一下

 

09 elu_layer.cpp

数学定义:

 

10 bnll_layer.cpp

数学定义:

这次就先这样。

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

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

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

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

 

 

BAPI_OUTB_DELIVERY_CHANGE扩展指南:利用EXTENSION2与SMOD_V50B0001实现自定义字段更新 本文详细解析了如何利用BAPI_OUTB_DELIVERY_CHANGE的EXTENSION2参数与增强点SMOD_V50B0001,在不修改标准代码的前提下,安全、标准地更新SAP交货单的自定义字段。通过清晰的步骤指南和实战代码示例,帮助开发者掌握通过增强字段实现定制化业务需求的完整流程与调试技巧。 阅读详情

相关推荐

Transformer代码(Pytorch实现和详解)!!!

这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。

xml的博客 5614

[caffe解读] caffe从数学公式到代码实现2-基础函数类

接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。absval_layer.cpp其中,下面这些layer是不需要反向传播的,大部...

hacker_long的专栏 473

PYNQ-Z2 开发板从镜像烧录到 Jupyter 交互全流程指南

本文详细介绍了PYNQ-Z2开发板从镜像烧录到Jupyter交互的全流程指南,包括硬件解析、镜像烧录技巧、设备启动与网络配置、Jupyter Notebook深度使用以及实战案例分享。通过具体步骤和实用技巧,帮助开发者快速上手PYNQ-Z2开发板,实现高效的FPGA开发和智能家居控制应用。

weixin_28736355的博客 441

caffe layer层详解

1、基本的layer定义,参数1、基本的layer定义,参数如何利用caffe定义一个网络,首先要了解caffe中的基本接口,下面分别对五类layer进行介绍Vision Layers可视化层来自于头文件 Header: ./include/caffe/vision_layers.hpp 一般输入和输出都是图像,这一层关注图像的2维的几何结构,并根据此结构对输入进行处理,特别是,大多数可视化层都通

swfa1的专栏 1万+

Orcad原理图导入Allegro

在即将设计的PCB中,将层叠设置好后,执行File→import→parameters,将刚才导出的.prm文件导入,很多参数就自动设置好了,与已完成的PCB里的参数保持一致。具体操作是:在已完成的PCB里执行File→Exoprt→Parameters,弹出下图所示的对话框,选择需要导出的设计参数后,设置到导出路径,导出记录设计参数的文件(.prm)。在.brd文件导入网表后,往往需要页面大小、格点、各层叠里各要素显示颜色等参数,手动设置十分麻烦,我们可以在一块已经完成的PCB里导出记录设计参数的文件。

sinat_27007097的博客 2085

UFS 功能描述:UFS boot

UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

m0_51720747的博客 1606

caffe 的layer的参数说明

最近在学习caffe做实验 今天就记录一下layer的参数及这些常用的参数的解释吧主要还是参考官方网站 http://caffe.berkeleyvision.org/tutorial/layers.html下面就介绍一下常用的layer的配置 以caffe中根目录下的models 中caffenet 其中主要有三个文件 deploy.prototxt solver.protot

Losteng的博客 1万+

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2981

深度学习caffe框架(2): layer定义

caffe的layers定义

几何君的算法天空 2683

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

Python 爬虫实战:爬取 B 站 UP 主的全部视频数据

本文详细介绍了基于Python开发B站UP主视频数据爬虫的技术方案。通过分析B站API接口,使用requests库发送HTTP请求并处理JSON数据,结合pandas进行结构化存储。文章重点解决了接口鉴权、分页爬取、反爬策略等核心难点,实现获取视频标题、播放量、点赞数等关键指标。同时强调数据爬取需遵守平台规范,仅限技术研究使用。该方案为B站视频内容分析提供了可靠的数据采集基础,具有实际应用价值。

2503_91057718的博客 2492

【caffe解读】 caffe从数学公式到代码实现1-导论

文章首发于微信公众号《与有三学AI》 [caffe解读] caffe从数学公式到代码实现1-导论 真的很多年没有认真写csdn博客了,我回来了 今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。 作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框架是有很大的区别的,而要想走的更远,开源框架的底层代码一定要去详读。 同时,很多的坑也...

hacker_long的专栏 899

第0章 《机器人工程师带你入门SLAM》专栏所有文章目录汇总(截止目前115篇文章),方便大家查看阅读

《机器人工程师带你入门SLAM》专栏文章汇总:优快云热销专栏已更新100+篇优质内容,涵盖SLAM技术全栈知识体系。文章分为三大类:1)基础工具与环境配置,包括Ubuntu、Git等必备技能;2)C++编程从入门到进阶,详解变量、类、模板等核心概念;3)SLAM核心库实战,深入解析ROS、Eigen、PCL等关键库的应用。专栏提供从计算机基础到项目实战的系统学习路径,并附代码实例。点击专栏主页可订阅查看全部内容,后续将保持更新。

行知SLAM 1072

caffe不支持relu6_【caffe教程2】caffe中的基础函数

本文首发于公众号《有三AI》[caffe解读] caffe从数学公式到代码实现2-基础函数类​mp.weixin.qq.com接着上一篇,本篇就开始读layers下面的cpp,先看一下layers下面都有哪些cpp。absval_layer.cpp accuracy_layer.cpp argmax_layer.cpp base_conv_layer.cpp base_data_layer.cpp...

weixin_39755952的博客 191

lwip-2.0.3

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[caffe解读] caffe从数学公式到代码实现1-导论

新板块说明今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框架...

hacker_long的专栏 543

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

caffe data层_【caffe教程1】 caffe代码导论

本文首发于公众号《有三AI》[caffe解读] caffe从数学公式到代码实现1-导论​mp.weixin.qq.com我这个系列caffe代码解读跟大部分人的思路不一样,一般读caffe代码思路是按照caffe的层级结构来,blob到layer到net各自分层来读,但我想提供一个另外的思路,从数学公式到代码实现。从每一个文件背后具体的数学含义来读,这对于我们非数学系或者数学基础不是很好的工程人员...

weixin_29290963的博客 240

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

文章首发于微信公众号《与有三学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_entr...

hacker_long的专栏 825

【caffe解读】 caffe从数学公式到代码实现5-caffe中的卷积

文章首发于微信公众号《与有三学AI》 [caffe解读] caffe从数学公式到代码实现5-caffe中的卷积 今天要讲的就是跟卷积相关的一些layer了 im2col_layer.cpp base_conv_layer.cpp conv_layer.cpp deconv_layer.cpp inner_product_layer.cpp 01 im2col_layer.c...

hacker_long的专栏 640

【caffe解读】 caffe从数学公式到代码实现3-shape相关类

文章首发于微信公众号《与有三学AI》 [caffe解读] caffe从数学公式到代码实现3-shape相关类 接着上一篇说,本篇开始读layers下面的一些与blobshape有关的layer,比如flatten_layer.cpp等,具体包括的在下面; flatten_layer.cpp slice_layer.cpp split_layer.cpp tile_layer.cpp con...

hacker_long的专栏 884

[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积

今天要讲的就是跟卷积相关的一些layer了im2col_layer.cppbase_conv_layer.cppconv_layer.cppdeconv_layer.cp...

hacker_long的专栏 516

[caffe解读] caffe从数学公式到代码实现3-shape相关类

接着上一篇说,本篇开始读layers下面的一些与blob shape有关的layer,比如flatten_layer.cpp等,具体包括的在下面;flatten_laye...

hacker_long的专栏 470

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

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

hacker_long的专栏 513

Caffe源码解读:BatchNormLayer原理

template void BatchNormLayer::LayerSetUp(const vector*>& bottom, const vector*>& top) { //获取BatchNormParameter参数列表 BatchNormParameter param = this->layer_param_.batch_norm_param(); //得到m

zyf19930610的专栏 808

caffe data层_【caffe教程3】caffe中的数据shape相关类

本文首发于公众号《有三AI》[caffe解读] caffe从数学公式到代码实现3-shape相关类​mp.weixin.qq.com接着上一篇说,本篇开始读layers下面的一些与blob shape有关的layer,比如flatten_layer.cpp等,具体包括的在下面;flatten_layer.cpp slice_layer.cpp split_layer.cpp tile_layer....

weixin_42157166的博客 254

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

c++调用caffe ssd_【caffe教程5】caffe中的卷积

本文首发于公众号《有三AI》[caffe解读] caffe从数学公式到代码实现5-caffe中的卷积​mp.weixin.qq.com今天要讲的就是跟卷积相关的一些layer了im2col_layer.cppbase_conv_layer.cppconv_layer.cppdeconv_layer.cppinner_product_layer.cpp1 im2col_layer.cpp这是caff...

weixin_34800976的博客 259
上一篇: 【caffe解读】 caffe从数学公式到代码实现1-导论
下一篇: 【分享预告】细数GAN和图像分类的前世今生
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄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、付费专栏及课程。

余额充值