《深度学习——实战caffe》——caffe数据结构

标签: caffe 结构
15人阅读 评论(0) 收藏 举报
分类:
caffe中一个CNN模型由Net表示,Net由多个Layer堆叠而成。

caffe的万丈高楼(Net)是由图纸(prototxt),用blob这些砖块筑成一层层(Layer),最后通过SGD方法(Solver)进行简装修(train)、精装修(finetune)实现的。

  • Blob数据结构介绍
    Blob提供了统一的存储器接口,TensorFlow中的Tensor也有对应的Blob数据结构。
    Caffe的基本存储单元是Blob,使用Blob格式的4维数组用于存储和交换数据,维度从低到高为(width_,height_,channels_,num_),用于存储数据或权值(data)和权值增量(diff),其中width_和height_分别表示图像的宽和高,channels_表示颜色通道RGB,num_表示第几个颜色通道。在进行网络计算时,每层的输出/输入都需要通过Blob对象缓冲。
//使用的是一个Blob的容器是因为某些Layer包含多组学习参数
vector<shared_ptr<Blob<Dtype>>> blobs_;
  • 1
  • 2
  • Blob数据结构描述
    src/caffe/proto/caffe.proto文件中,Blob描述如下:
// packed表示这些值在内存中紧密排布,没有空洞
message BlobShape{
    //只包括若干int64类型值,分别表示Blob每个维度的大小
    repeated int64 dim = 1 [packed = true];
}
message BlobProto{
    //包含一个BlobShape对象
    optional BlobShape shape = 7;
    //包含若干浮点元素,存储数据或者权值,元素数目由shape或者(num, channels, height, width)确定
    repeated float data = 5 [packed = true];
    //包含若干浮点元素,存储增量信息,维度与data数组一致
    repeated float diff = 6 [packed = true];
    //与data类似,类型为double
    repeated double double_data = 7 [packed = true];
    //与diff类似,类型为double
    repeated double double_diff = 8 [packed = true];
    //维度信息可选值,新版Caffe推荐使用shape,而不用后面的值
    optional int32 num = 1 [default = 0];
    optional int32 channels = 2 [default = 0];
    optional int32 height = 3 [default = 0];
    optional int32 width = 4 [default = 0];
}

  • 函数介绍
    Dtype data_at(const int n, const int c, const int h,const int w) const:通过n,c,h,w 4个参数来来获取该向量位置上的值。
    Dtype diff_at(const int n, const int c, const int h,const int w) const
    Dtype asum_data() const:绝对值之和,即L1-范式
    Dtype asum_diff() const
    Dtype sumsq_data() const:平方和,即L2-范式
    Dtype sumsq_diff() const
    void scale_data(Dtype scale_factor):data乘以一个标量
    void scale_diff(Dtype scale_factor)
    void ShareData(const Blob& other):共享一个Blob的data
    void ShareDiff(const Blob& other)
    const Dtype* cpu_data() const:只读CPU上的数据
    const Dtype* gpu_data() const
    void set_cpu_data(Dtype* data):设置CPU上的数据
    const Dtype* cpu_diff() const:只读CPU上的偏差
    const Dtype* gpu_diff() const
    Dtype* mutable_cpu_data():读写cpu上的数据
    Dtype* mutable_gpu_data()
    Dtype* mutable_cpu_diff():读写CPU上计算偏差
    Dtype* mutable_gpu_diff()
    void Update():更新变量值,使数据同步。
    void FromProto(const BlobProto& proto, bool reshape=true):反序列化函数,从BlobProto中恢复一个Blob对象
    void ToProto(BlobProto* proto, bool write_diff=false) const:序列化函数,将内存中的Blob对象保存到BlobProto中
    ToProto()和FromProto()可将Blob内部值保存到磁盘中或者从磁盘中载入到内存。
  • 使用ProtoBuffer而不使用结构体的原因:
    1)结构体的序列化/反序列化操作需要额外的编程实现,难以做到结构标准化;2)结构体中包含变长数据(一般用指向某个内存地址的指针)时,需要更加细致的工作保证数据的完整性。
    ProtoBuffer将编程最容易出现问题的地方加以隐藏,让机器自动处理,提高了程序的健壮性。
  • Blob模板类
    在include/caffe/blob.hpp中申明了Blob模板类,并封装了SyncedMemory类,const int kMaxBlobAxes = 32定义了Blob最大维数目。

//状态机变量:未初始化、CPU数据有效、GPU数据有效、已同步
enum SyncedHead {UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED}


<span style="color:#333333;">#include <vector>
#include <iostream>
#include <caffe/blob.hpp>

using namespace caffe;
using namespace std;

int main(void)
{
  Blob<float> a;
 
  cout<<"Size :"<<a.shape_string()<<endl;
  
  a.Reshape(1,2,3,4);
  
  cout<<"Size :"<<a.shape_string()<<endl;

 float *p = a.mutable_cpu_data();
  
  for(int i = 0; i < a.count(); i ++)
 {
   p[i] = i;
 }
 
 for(int u = 0; u < a.num(); u ++)
 {
  for(int v = 0; v < a.channels(); v ++) 
   {
     for(int w = 0; w < a.height(); w ++)
     {
	for(int x = 0; x < a.width(); x ++)
        {
	  cout<<"a["<<u<<"]["<< v << "][" << w << "][" << x << "] =" << a.data_at(u,v,w,x)<< endl;
        }
     }
   }
 }
  return 0; 
}
</span>

编译:

sudo g++ -o app blob_demo.cpp -I include/ -D CPU_ONLY -I .build_release/src/ -L build/lib/ -lcaffe -lglog -lboost_system 

就生成了可执行文件app

export LD_LIBRARY_PATH=build/lib/:$LD_LIBRARY_PATH

./app


查看评论

pyCharm最新2018激活码

因公司的需求,需要做一个爬取最近上映的电影、列车号、航班号、机场、车站等信息,所以需要我做一个爬虫项目,当然java也可以做爬虫,但是还是没有python这样方便,所以也开始学习Python啦!!!欲...
  • u014044812
  • u014044812
  • 2017-12-06 10:13:10
  • 293664

2018 最新注册码【激活码】、在线激活 pycharm 完整方法(亲测有效)

2018-02-06修改如下: 原来方法的第二种还是有效的,操作如下 (1)更新hosts文件 host文件地址 hosts文件,在windows中的地址为: C:\Window...
  • qq_32811489
  • qq_32811489
  • 2017-11-26 10:55:22
  • 143034

Pycharm永久激活

转载自:点击打开链接 pycharm是很强大的开发工具,但是每次注册着实让人头疼。网络上很多注册码、注册服务器等等、但都只是一年或者不能用;为次有如下解决方案。亲测有效!!! 如果想让py...
  • jiangjiang_jian
  • jiangjiang_jian
  • 2018-01-23 20:58:00
  • 3496

pycharm最新专业版2018激活方法

2017-10-06:pycharm最新为2.3版本: 2017-12-12:pycharm最新为3.0版本 2018-2-10: pycharm最新为3.3版本 最新激活方法: 使用co...
  • IAMoldpan
  • IAMoldpan
  • 2017-10-06 17:19:40
  • 21184

pycharm professional 3.3 激活

https://jetlicense.nss.im/  本人亲测有效!~
  • lin06051180
  • lin06051180
  • 2018-01-19 14:35:44
  • 4878

Pycharm 注册 Pycharm 破解 Pycharm 注册破解 亲测多法 仅此方有效 有效期至2099年

1. Pycharm的安装方法,论坛很多,这里就不赘述了。参照:http://blog.csdn.net/qq_29883591/article/details/526644782. 下载Pychar...
  • wills798
  • wills798
  • 2018-03-08 17:31:18
  • 1465

Pycharm 激活

Pycharm和Komodo等IDE可是编程者的福音,这些IDE完全把你从不必要的编译,整合,查找等文件处理工作中解脱出来,能够让你专注与编码本身,同时这些IDE还整合了目前流行的编码框架,包管理器,...
  • andybegin
  • andybegin
  • 2018-03-02 22:40:52
  • 2496

IDEA和PyCharm 等系列产品激活激活方法和激活码

原文链接:http://blog.csdn.net/weixin_37937646/article/details/79119540 友情提示:这篇博文的激活方式可能慢慢就不能用了,大家可以关注一下...
  • Stripeybaby
  • Stripeybaby
  • 2018-03-04 22:29:02
  • 2607

idea和Pycharm (2018 )等系列产品激活激活方法和激活码

使用破解补丁进行激活优点:有效期至2099年,不出意外,这辈子肯定够用了缺点:稍微麻烦些,不过不要紧,为了以后省事,都值了下面是具体的破解激活步骤:1. 下载破解补丁文件,路径为:http://ide...
  • aglne
  • aglne
  • 2018-03-29 09:39:25
  • 784

2017 Pycharm激活码

2016年的激活码只能用到2017.2.25,于昨日已经过期了。注意:激活码已失效 转到这里:Pycharm破解现提供最新激活码:http://idea.lanyus.com/BIG3CLIK6F-...
  • kevinelstri
  • kevinelstri
  • 2017-02-26 14:41:17
  • 201316
    个人资料
    等级:
    访问量: 363
    积分: 341
    排名: 23万+
    文章存档