Caffe源码解析1:Blob

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html

转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/

首先看到的是Blob这个类,Blob是作为Caffe中数据流通的一个基本类,网络各层之间的数据是通过Blob来传递的。这里整个代码是非常规范的,基本上条件编译,命名空间,模板类,各种不太经常看到的关键字如exlicit,inline等等。
首先提一下explicit关键字的作用是禁止单参数构造函数的隐式转换,具体含义谷歌即可。还有inline的作用,iniline主要是将代码进行复制,扩充,会使代码总量上升,好处就是可以节省调用的开销,能提高执行效率。

1主要变量

shared_ptr<SyncedMemory> data_;
shared_ptr<SyncedMemory> diff_;
shared_ptr<SyncedMemory> shape_data_;
vector<int> shape_;
int count_;
int capacity_;

BLob只是一个基本的数据结构,因此内部的变量相对较少,首先是data_指针,指针类型是shared_ptr,属于boost库的一个智能指针,这一部分主要用来申请内存存储data,data主要是正向传播的时候用的。同理,diff_主要用来存储偏差,update data,shape_datashape_都是存储Blob的形状,一个是老版本一个是新版本。count表示Blob中的元素个数,也就是个数*通道数*高度*宽度,capacity表示当前的元素个数,因为Blob可能会reshape。

2主要函数

template <typename Dtype>
class Blob {public:Blob(): data_(), diff_(), count_(0), capacity_(0) {}/// @brief Deprecated; use <code>Blob(const vector<int>& shape)</code>.explicit Blob(const int num, const int channels, const int height,const int width);explicit Blob(const vector<int>& shape);/// @brief Deprecated; use <code>Reshape(const vector<int>& shape)</code>.void Reshape(const int num, const int channels, const int height,const int width);

其中Blob作为一个最基础的类,其中构造函数开辟一个内存空间来存储数据,Reshape函数在Layer中的reshape或者forward操作中来adjust dimension。同时在改变Blob大小时,内存将会被重新分配如果内存大小不够了,并且额外的内存将不会被释放。对input的blob进行reshape,如果立马调用Net::Backward是会出错的,因为reshape之后,要么Net::forward或者Net::Reshape就会被调用来将新的input shape 传播到高层

Blob类里面有重载很多个count()函数,主要还是为了统计Blob的容量(volume),或者是某一片(slice),从某个axis到具体某个axis的shape乘积。

inline int count(int start_axis, int end_axis)

并且Blob的Index是可以从负坐标开始读的,这一点跟Python好像

inline int CanonicalAxisIndex(int axis_index) 

对于Blob中的4个基本变量num,channel,height,width可以直接通过shape(0),shape(1),shape(2),shape(3)来访问。

计算offset

inline int offset(const int n, const int c = 0, const int h = 0, const int w = 0)
inline int offset(const vector<int>& indices)

offset计算的方式也支持两种方式,一种直接指定n,c,h,w或者放到一个vector中进行计算,偏差是根据对应的n,c,h,w,返回的offset是((n * channels() + c) * height() + h) * width() + w

其实里面稍加留意可以看到有很多的

CHECK_GE
CHECK_LE
CHECK_EQ
....

等等看意思就知道了,肯定是在做比较Geater or Eqal这样的意思。这其实是GLOG,谷歌的一个日志库,Caffe里面用用了大量这样的宏,看起来也比较直观

void CopyFrom(const Blob<Dtype>& source, bool copy_diff = false,bool reshape = false);

从一个blob中copy数据 ,通过开关控制是否copy_diff,如果是False则copy data。reshape控制是否需要reshape。好我们接着往下看

inline Dtype data_at(const int n, const int c, const int h, const int w)
inline Dtype diff_at(const int n, const int c, const int h, const int w)
inline Dtype data_at(const vector<int>& index)
inline Dtype diff_at(const vector<int>& index)
inline const shared_ptr<SyncedMemory>& data()
inline const shared_ptr<SyncedMemory>& diff()

这一部分函数主要通过给定的位置访问数据,根据位置计算与数据起始的偏差offset,在通过cpu_data*指针获得地址。下面几个函数都是获得

const Dtype* cpu_data() const;
void set_cpu_data(Dtype* data);
const int* gpu_shape() const;
const Dtype* gpu_data() const;
const Dtype* cpu_diff() const;
const Dtype* gpu_diff() const;
Dtype* mutable_cpu_data();
Dtype* mutable_gpu_data();
Dtype* mutable_cpu_diff();
Dtype* mutable_gpu_diff();

可以看到这里有data和diff两类数据,而这个diff就是我们所熟知的偏差,前者主要存储前向传递的数据,而后者存储的是反向传播中的梯度

void Update();

看到update里面面调用了

caffe_axpy<float>(const int N, const float alpha, const float* X,float* Y)
{ cblas_saxpy(N, alpha, X, 1, Y, 1); }

这个函数在caffe的util下面的match-functions.cpp里面,主要是负责了线性代数库的调用,实现的功能是

 

Y=alpha∗X+beta∗YY=alpha∗X+beta∗Y


也就是blob里面的data部分减去diff部分

void FromProto(const BlobProto& proto, bool reshape = true);
void ToProto(BlobProto* proto, bool write_diff = false) const;

这两个函数主要是将数据序列化,存储到BlobProto,这里说到Proto是谷歌的一个数据序列化的存储格式,可以实现语言、平台无关、可扩展的序列化结构数据格式。Caffe里面数据的存储都采用这一结构,这里就不深入展开,具体可以参照这篇文章,对于proto的序列化和反序列都讲解的非常详细http://***/Article/34963

Dtype asum_data() const;//计算data的L1范数
Dtype asum_diff() const;//计算diff的L1范数
Dtype sumsq_data() const;//计算data的L2范数
Dtype sumsq_diff() const;//计算diff的L2范数
void scale_data(Dtype scale_factor);//将data部分乘以一个因子
void scale_diff(Dtype scale_factor);//将diff部分乘一个因子

这几个函数是一些零散的功能,一看就懂。

void ShareData(const Blob& other);
void ShareData(const Blob& other);

这两个函数看名字就知道了一个是共享data,一个是共享diff,具体就是将别的blob的data和响应的diff指针给这个Blob,实现数据的共享。同时需要注意的是这个操作会引起这个Blob里面的SyncedMemory被释放,因为shared_ptr指针被用=重置的时候回调用响应的析构器。

bool ShapeEquals(const BlobProto& other);

这函数就不用说了,比较两个Blob形状是否相同
好了,基本上Blob的主要参数功能基本就涵盖在里面了,以上只是我的拙见,如有纰漏,还望指出,万分感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458115.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学后感

今天上了构建之法&#xff0c;我加深了对软件工程的了解&#xff0c;也明白了单元测试和回归测试对软件开发的重要性&#xff0c;然而在软件开发的过程中&#xff0c; 一个团队是需要一定的流程来管理开发活动&#xff0c;每个工程师在软件生命周期所做的工作也应该有一个流程&…

Caffe源码解析2:SycedMem

from:https://www.cnblogs.com/louyihang-loves-baiyan/p/5150554.html 转载请注明出处&#xff0c;楼燚(y)航的blog&#xff0c;http://www.cnblogs.com/louyihang loves baiyan/ 看到SyncedMem就知道&#xff0c;这是在做内存同步的操作。这类个类的代码比较少&#xff0c;…

REST学习

RPC架构与REST架构 RPC&#xff1a;RPC将服务器看作一些列动作的集合(需要做某件事) REST&#xff1a;将服务器看作分布式对象集合&#xff0c;客户端通过调用这些对象上的方法来执行特定的任务&#xff0c;组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互…

HI3559A和AI深度学习框架caffe

from:http://blog.sina.com.cn/s/blog_156e567660102ygdf.html 1、HI3559A支持深度学习框架caffe。其中的NNIE神经网络加速单元是主要的属性。 2、caffe是一种快速深度学习框架和TensorFlow一样是一组标准深度学习开源框架。 3、对应想尝试AI深度学习的朋友可以按照网上的流…

UValive4195 Heroes of Money and Magic

斜率优化 想骂人了&#xff0c;马格吉最后调了半小时 TMD造数据的人是SB吧&#xff1f; 我写 while(scanf("%d%d",&n,&m)!EOF&&n) 然后就TMD无限WA...WA...WA... 尼玛 改成while(scanf("%d%d",&n,&m),n) 就过了&#xff0c;就过了…

Google Protocol Buffer 的使用和原理

from: https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html 简介 什么是 Google Protocol Buffer&#xff1f; 假如您在网上搜索&#xff0c;应该会得到类似这样的文字介绍&#xff1a; Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言…

Electron

跨平台桌面app开发 Appjs hex nwjs electron 官网&#xff1a;http://electron.atom.io/ 中文文档&#xff1a;https://github.com/atom/electron/tree/master/docs-translations/zh-CN zcbenz&#xff1a; https://github.com/zcbenz https://github.com/atom/electron simple…

WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化

在本篇文章中&#xff0c;我们将讨论WCF四大契约&#xff08;服务契约、数据契约、消息契约和错误契约&#xff09;之一的消息契约&#xff08;Message Contract&#xff09;。服务契约关注于对服务操作的描述&#xff0c;数据契约关注于对于数据结构和格式的描述&#xff0c;而…

【深度学习数据集】常用公开图片数据集下载

1.MNIST MNIST是一个手写数字数据库&#xff0c;它有60000个训练样本集和10000个测试样本集&#xff0c;每个样本图像的宽高为28*28。此数据集是以二进制存储的&#xff0c;不能直接以图像格式查看&#xff0c;不过很容易找到将其转换成图像格式的工具。 最早的深度卷积网络Le…

常用的几种卷积神经网络介绍

常用的几种卷积神经网络介绍 标签&#xff08;空格分隔&#xff09;&#xff1a; 深度学习 这是一篇基础理论的博客&#xff0c;基本手法是抄、删、改、查&#xff0c;毕竟介绍这几个基础网络的博文也挺多的&#xff0c;就算是自己的一个笔记吧&#xff0c;以后忘了多看看。主…

计算客 (人人都有极客精神)爆力

人人公司是一家极为鼓舞极客精神的公司&#xff0c;当有重要的项目须要上线但又时间太紧。甚至须要当天上线的时候。往往会挂起海盗旗开启电子日期显示。让大家能够在对时间有更明白的感知的情况下&#xff0c;同心协力搞定重要的项目。海盗旗下方的电子屏显示的日期形式为 YYY…

深度学习案例

1. neural-style&#xff1a;利用卷积神经网络将一幅图像的内容与另一幅图像的风格相结合 https://github.com/jcjohnson/neural-style 2.Nerual Doodles&#xff1a;把 2 位的 Doodle 转成精良的艺术品 https://github.com/alexjc/neural-doodle 3. srez&#xff1a;通过深度…

深度学习图像标注工具汇总

对于监督学习算法而言&#xff0c;数据决定了任务的上限&#xff0c;而算法只是在不断逼近这个上限。世界上最遥远的距离就是我们用同一个模型&#xff0c;但是却有不同的任务。但是数据标注是个耗时耗力的工作&#xff0c;下面介绍几个图像标注工具&#xff1a; Labelme Labe…

UIBarbuttonItem

APPDelegate: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; //创建主界面&#xff0c;导航栏的第一个页面 FirstViewContr…

深度残差网络ResNet解析

ResNet在2015年被提出&#xff0c;在ImageNet比赛classification任务上获得第一名&#xff0c;因为它“简单与实用”并存&#xff0c;之后很多方法都建立在ResNet50或者ResNet101的基础上完成的&#xff0c;检测&#xff0c;分割&#xff0c;识别等领域都纷纷使用ResNet&#x…

Oracle-一个中文汉字占几个字节?

Oracle 一个中文汉字占用几个字节 Oracle 一个中文汉字 占用几个字节&#xff0c;要根据Oracle中字符集编码决定!!! 1. 如果定义为VARCHAR2(32 CHAR),那么该列最多就可以存储32个汉字&#xff0c;如果定义字段为VARCHAR2&#xff08;32&#xff09; 或VARCHAR2&#xff08;32 B…

基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN

object detection我的理解&#xff0c;就是在给定的图片中精确找到物体所在位置&#xff0c;并标注出物体的类别。object detection要解决的问题就是物体在哪里&#xff0c;是什么这整个流程的问题。然而&#xff0c;这个问题可不是那么容易解决的&#xff0c;物体的尺寸变化范…

iPhone屏幕尺寸/launch尺寸/icon尺寸

屏幕尺寸 6p/6sp 414 X 7366/6s 375 X 6675/5s 320 X 568 4/4s 320 X 480launch尺寸 6p/6sp 1242 X 2208 3x6/6s 750 X 1334 2x5/5s 640 X 1136 2x4/4s 640 X 960 2x仔细观察会发现l…

CNN的发展历史(LeNet,Alexnet,VGGNet,GoogleNet,ReSNet)

欢迎转载&#xff0c;转载请注明&#xff1a;本文出自Bin的专栏blog.csdn.net/xbinworld。 关于卷积神经网络CNN&#xff0c;网络和文献中有非常多的资料&#xff0c;我在工作/研究中也用了好一段时间各种常见的model了&#xff0c;就想着简单整理一下&#xff0c;以备查阅之需…

读取csv格式的数据

1.直接上代码&#xff0c;关键是会用 2.代码如下&#xff1a; <?php #添加推荐到英文站 $file fopen(code.csv,r); while ($data fgetcsv($file)) { //每次读取CSV里面的一行内容 //print_r($data); //此为一个数组&#xff0c;要获得每一个数据&#xff0c;访问数组下…