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

caffe入门教程 (一)简介 1.caffe是一个清晰而高效的深度学习框架,纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口,可以在CPU和GPU直接无缝切换; 2.caffe的主要优势: (1)CPU与GPU的无缝切换; (2)模型与优化都是通过配置文件来设置,无需代码; 3.caffe的下载与安装: (1)下载 (2)安装 (3)caffe的下载与安装以及一些基本的介绍官网 阅读详情

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

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

真的很多年没有认真写csdn博客了,我回来了

今天开一个新板块,目标是死磕现有的几大机器学习框架的代码,给想入门的小白们一些帮助。

作为一个在图像行业战斗了几年的程序员,深知入门一个框架,和真的能用好一个框架是有很大的区别的,而要想走的更远,开源框架的底层代码一定要去详读。

同时,很多的坑也是在代码中,不仔细读是不知道的。所以,我会来跟大家系统细致地学习一些主流的机器学习框架。

今天这个是caffe,大概会有7篇左右的文章,一般读caffe代码思路是按照caffe的层级结构来,blob到layer到net各自分层来读,但我想提供一个另外的思路,从数学公式到代码实现。

从每一个文件背后具体的数学含义来读,这对于我们非数学系或者数学基础不是很好的工程人员来说,是比较适合的。

采取的形式就是,layer definition,caffe layer,caffe testlayer的格式,举个例子来说,比如softmax,那我就打算从softmax的数学定义,caffe softmax层的实现,caffesoftmax test layer的实现。重要代码要加上test layer,因为当我们自己实现某些类时,往往需要梯度反向求导,这时候最好自己写test来验证自己的代码是否正确。

好了,下面就开始吧。当然,现在这是第一篇,所以我们还是不可避免先打下基础,先要阅读下面的内容,对caffe的代码有基本的了解。这是include/caffe根目录下面的代码list。

blob.hpp
caffe.hpp
common.hpp
data_transformer.hpp
filler.hpp
internal_thread.hpp
layer.hpp
layer_factory.hpp
net.hpp
parallel.hpp
sgd_solvers.hpp
solver.hpp
solver_factory.hpp
syncedmem.hpp

一个一个来。

 

01 blob.hpp&cpp

blob是caffe中的基础数据单元,一个blob是一个四维张量,(N,C,H,W),N是batch size大小,C是channel,H,W分别是图像宽高,由于caffe擅长于做图像,所以这个定义天然适合图像。故一个256*256的rgb图像,blob size是(1,3,256,256)。

blob.hpp,需要注意的就是下面的变量和函数

其中data_存储数据,diff_存储梯度,shape_分别是blob_的尺度,count_是所有数据数目,即N*C*H*W。

以后要访问这些数据,就会用到下面的函数,其中cpu_data是只读,mutable_cpu_data是可写,gpu类似。

上面还有一个疑问,那就是初次见到SyncedMemory类会不知道它是做什么的,它主要负责在GPU或者CPU上分配内存以及保持数据的同步作用。

可参考下面资料:

http://blog.youkuaiyun.com/xizero00/article/details/51001206

http://www.cnblogs.com/korbin/p/5606770.html

由于展开是另一个篇幅,因此我们不过多停留在此,知道blob是通过这样的方式存取即可。

 

02 caffe.hpp&cpp等

把这几个放这里,一是这里很多是关于gpu和内存等较为底层的编程的,看起来比较费劲,一般也不需要去修改,大家会用即可。重点会讲一下factory。

caffe.hpp头文件包含其他基础hpp。

internal_thread.hpp,与线程有关的变量函数。

parallel.hpp,与并行有关的变量函数。

syncedmem.hpp,内存分配和Caffe的底层数据的切换

solver_factory.hpp,layer_factory.hpp,顾名思义,分别是caffe solver的工厂类模板定义和普通layer的模板定义。

举例拿sovler来多说几句,solver_factory.hpp,其中solver指的是优化方法,由于caffe优化采用的就是梯度下降的方法,包括SGD,NesterovSolver,RMSPropSolver,AdamSolver等通通都定义在sgd_solvers.hpp中。

工厂设计模型,简单了解如下

http://developer.51cto.com/art/201107/277728.htm

http://alanse7en.github.io/caffedai-ma-jie-xi-4/

深入了解需要自己去看,从代码的角度来看就是解决重复造轮子的问题,减少重复代码,在caffe的面试中经常会问到噢。

看下它的代码,重要变量两个

typedef Solver<Dtype>* (*Creator)(const
SolverParameter&);

typedef std::map<string, Creator>
CreatorRegistry;

重要函数两个,

static CreatorRegistry& Registry() { staticCreatorRegistry*
g_registry_ = new CreatorRegistry();
  return *g_registry_;
}
static Solver<Dtype>* CreateSolver(const
SolverParameter& param) {
  const string& type = param.type();
  CreatorRegistry& registry = Registry();
  CHECK_EQ(registry.count(type), 1) << "Unknownsolver type: " << type
      << " (known types: " << SolverTypeListString()<< ")";
  return registry[type](param);
}

其中需要注意的是,SolverParameter是一个配置参数不说,CreatorRegistry就是我们以后自定义层需要知道的,需要知道registry是一个map,存储的就是字符串以及对应的以函数指针形式存储的Creator类型的函数,而注册都会在cpp中进行,以后详解。

common.hpp,是一些与io有关的函数与变量,cpu与gpu模式设定变量Brew mode_;函数set_mode,setDevice,以及与随机数有关的函数变量shared_ptr<RNG>random_generator_;

 

03 datatransform.hpp&cpp

这是很重要的一个文件,当我们自定义数据层的时候会用到,它的作用就是从磁盘中读取数据塞进caffe定义的变量内存中。从它的头文件就可以看出,它依赖于blob,common,以及caffe.pb.h

#include "caffe/blob.hpp"
#include "caffe/common.hpp"
#include "caffe/proto/caffe.pb.h"

caffe.pb.h中就包含了需要序列化的变量。

datatransform.hpp中的变量如下:

shared_ptr<Caffe::RNG> rng_;
Phase phase_;
Blob<Dtype> data_mean_;
vector<Dtype> mean_values_;

可见存储了常见的mean_value。

datatransform.hpp中的的核心是重载的transform函数,它可以按照不同的输入来载入数据,我们平常在caffe内部做的随机crop,flip等等操作都在这里完成,具体大家可以去研究源码,静下心看非常简单。

void Transform(const vector<Datum> &datum_vector,Blob<Dtype>* transformed_blob);
void Transform(const vector<cv::Mat> & mat_vector,Blob<Dtype>*
transformed_blob);
void Transform(const cv::Mat& cv_img,Blob<Dtype>* transformed_blob);

 

04 filler.hpp

它没有对应的cpp,所有实现都在hpp中,因为很简单,它就是对权重初始化的,其中包含,constantfiller,Gaussianfiller,XavierFiller,MSRAFiller等等,相信大家都比较熟了。

 

05 solver.hpp

这就是caffe 迭代求解优化的函数定义,其中重要变量loss就在这里,这就是训练caffe时显示出的loss的来源

vector<Dtype> losses_;
Dtype smoothed_loss_;
SolverParameter param_;

迭代优化的函数,

virtual void Solve(const char* resume_file = NULL);
inline void Solve(const string resume_file) {Solve(resume_file.c_str()); }
void Step(int iters);

 

06 layer.hpp

这就是一个层的定义了,想必大家很有兴趣,那具体都有什么呢?

我们首先看变量,

LayerParameter layer_param_;
vector<Dtype> loss_;

然后看重要函数

LayerSetUp,用于layer初始化,一般是定义一些shape,初始化一些变量。

virtual void LayerSetUp(constvector<Blob<Dtype>*>& bottom, constvector<Blob<Dtype>*>&

Forward,Backward的cpu和gpu版本,除了数据层等少量层外始终成对存在的前向和反向函数,forward是基于bottom计算top,backward则是基于top计算bottom,很好理解。

virtual void Forward_cpu(constvector<Blob<Dtype>*>& bottom, constvector<Blob<Dtype>*>& top) = 0;
virtual void Forward_gpu(constvector<Blob<Dtype>*>& bottom, constvector<Blob<Dtype>*>& top) {
  Fackward_cpu(bottom,top);
}
virtual void Backward_cpu(constvector<Blob<Dtype>*>& top,
const vector<bool>& propagate_down, constvector<Blob<Dtype>*>& bottom) = 0;
virtual void Backward_gpu(constvector<Blob<Dtype>*>& top, const vector<bool>&propagate_down, const vector<Blob<Dtype>*>&bottom) {
  Backward_cpu(top, propagate_down, bottom);
}

 

07 net.hpp

这是最大的一个hpp了,也是最高层的,就是整个网络的定义。

看看重要变量:

vector<shared_ptr<Layer<Dtype> > > layers_;
vector<string> layer_names_;

layers_就是所有层,layer_names_;存储了名字,以后在我们inference的时候会需要经常用到。

vector<float> params_lr_;
vector<bool> has_params_lr_;

上面是每一层学习率的参数,在我们想要固定某些层不让其学习,或者调整不同层的学习率时,会非常重要。其实还有很多重要变量如,

vector<Dtype> blob_loss_weights_;
Phase phase_;

都是经常接触的,不一一描述了大家自己看代码。

下面是一个重载的重要函数,

void CopyTrainedLayersFrom(const
NetParameter& param);
void CopyTrainedLayersFrom(const string
trained_filename);
void CopyTrainedLayersFromBinaryProto(conststring
trained_filename);
void CopyTrainedLayersFromHDF5(const string
trained_filename);

它是重要的初始化网络的方法,可以实现不同形式输入的初始化,在inference时会经常使用的。

 

好了,第一次基础就这么多,并没有非常细致的讲述而只是对重要内容进行介绍,在开始下面的文章之前,一定要熟读上面的这些hpp和对应cpp文件,对它有什么是什么,熟练于胸。

 

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

https://zhuanlan.zhihu.com/c_151876233

注:部分图片来自网络

—END—

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

 

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

 

 

 

 

 

 

最新版Node.js下载安装及环境配置教程(非常详细) 选择对应你系统的Node.js版本。 阅读详情

相关推荐

步进电机驱动算法——梯形加减速算法

目录步进电机梯形加减速梯形加减速算法原理分析算法实现 步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单、实现容易、价格较低,这种开环控制方式,负载位置对控制电路没有反馈。 对于步进电机,控制脉冲的输入并不依赖于转子的位置,而是按一固定的规律发出控制脉冲,如果励磁变化太快,电机不能移动到新的位置,那么实际负载位置与理想位置就会产生一个偏差,就有可能出现失步或者过冲现象,所以需要使用加减速算法。 梯形加减速算法,S加减速算法等

aaa376070331的博客 3万+

深度学习Caffe框架入门视频课程

深度学习框架caffe入门,详解网络配置中每一个层的结构和参数项,对于超参数配置文件详解每一个参数的含义以及选择策略。对于数据源实例演示了两种常用的数据源LMDB和HDF5格式。课程涉及许多caffe框架的小技巧如绘制网络图和loss曲线,自定义python层等。希望大家通过学习可以熟练使用caffe去训练网络完成各自的任务。

【数据集】waymo motion dataset介绍与数据解析可视化

waymo motion数据集下载,数据描述,数据特征和地图特征,数据解析并完成数据可视化

shuaixio的博客 5184

深度学习(六)caffe入门学习

本文主要讲解caffe的整个使用流程,适用于初级入门caffe,通过学习本篇博文,理清项目训练、测试流程。初级教程,高手请绕道。 我们知道,在caffe编译完后,在caffe目录下会生成一个build目录,在build目录下有个tools,这个里面有个可执行文件caffe,如下图所示: 有了这个可执行文件我们就可以进行模型的训练,只需要学会调用这个可执行文件就可以了,这便是最简单的caffe学习,不需要对caffe底层的东西懂太多,只需要会调参数,就可以构建自己的网络,然后调用这个可执行文件就可以进行训练

hjimce的专栏 5万+

Vue - 解决 Property or method “__v_isRef“ is not defined on the instance but referenced(浏览器控制台报错,代码没错)

vue,vue2控制台报错,vue报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue代码没问题,但是报错Propertyormethod"__v_isRef"isnotdefinedontheinstancebutreferenced,vue2如何解决报错,vue怎么解决报错问题,vue2Propertyormethod"__v_isRef"isnotdefi

🏆 前端领域优质创作者 4503

YOLO11涨点优化:loss优化 | 一种新的基于Wasserstein距离的小目标检测评估方法,助力小目标涨点

提出了一种新的基于Wasserstein距离的小目标检测评估方法,通过它们对应的高斯分布计算它们之间的相似性

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1021

caffe原理之softmax函数

一.softmax简介 softmax主要应用的地方是logistic模型对于多分类模型的推广,将多个神经元的输出问题映射到(0,1)区间中,它的公式为 当某个类的预测值很大时该类的分量流趋向于1,其他类的分量值就变得很小。 二.前向传播 在caffe中的softmax layer中它的前向传播过程如下所示 输入的向量经过指数化和归一化后...

weixin_34090643的博客 311

掌握C++新特性中智能指针的综合指南

本文是一篇关于C++中智能指针的综合指南,旨在深入探讨现代内存管理的核心概念和技术。智能指针是C++中一种强大的工具,可以帮助开发人员更安全、高效地管理内存资源。通过详细解析各种类型的智能指针,包括unique_ptr、shared_ptr和weak_ptr,读者将了解它们的原理、用法和适用场景。本文将重点介绍智能指针的优势,如自动内存释放、避免内存泄漏和循环引用等问题。此外,还将讨论智能指针与传统指针的区别,并提供一些最佳实践和实用技巧,帮助读者在实际项目中正确、高效地使用智能指针。

Lion_Long的博客 1200

caffe中的softmax layer

在caffe中的lenet实现最后一层是softmax layer,输出分类的结果,下面就简单介绍一下softmax回归。     1,首先,在caffe中,softmax layer输出的是原始的输入在每一个分类标签上的概率,例如在lenet网络中,输出的分类共有0-9的10中分类,那么softmax layer就会输出含有10个元素的向量,每一个元素表示输入在每一个分类上的概率。

Buyi_Shizi的博客 1万+

【经验&技巧】IBIS AMI模型眼图仿真问题探讨

在ADS的仿真环境中,不论发送和接收的AMI模型是否为true或者false,都可以将通道仿真设置为统计模式,但是,如果有一方的Init函数为false,在统计模式下,处于false状态的模型将不能执行其自带的后处理功能,如下图所示,左边的统计模式和右边的逐比特模式眼图存在明显的差异,原因在于,接收端的init函数为false导致在统计模式中不能对眼图进行DFE处理,换言之,此时统计模式下的眼图就是未经任何处理的“生图”。

一只豌豆象的博客 1767

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2506

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

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

hacker_long的专栏 543

使用SIMD思想进行memcpy的优化

arm64平台的memcpy的性能优化,相比C库提升30~40%,SIMD优化思路

zhaoxin1989的博客 1万+

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

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

weixin_29290963的博客 240

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【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从数学公式到代码实现2-基础函数类

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

hacker_long的专栏 473

[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不支持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

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

【好专栏】深度学习框架不会用?12大主流深度学习框架快速入门,你值得拥有!...

欢迎来到【好专栏】,本次我们给大家推荐一个专栏,名为《12 大深度学习开源框架快速入门》,这个专栏为介绍了深度学习的 12 大主流框架,附带实践案例,能够让读者快速掌握深度学习框架的使用...

Leong Blog 516
上一篇: 【行业进展】谷歌4大AI黑科技部门,你可知
下一篇: 【caffe解读】 caffe从数学公式到代码实现2-基础函数类
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄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、付费专栏及课程。

余额充值