blob数据结构是caffe中基本的数据存储单元,它主要存储的数据是网络中的中间数据变量,比如各层的输入和输出;代价函数关于网络各层参数的梯度。

blob中除了存储数据外,还有一些标记数据的参数,以下就是一些blob中的数据成员:

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

data_:表示网络各层的输入和输出;

diff_:表示代价函数相对于各层参数的梯度;

shape_:是一个可变数组,shape_中主要存储4个变量:num表示一个batch中的样本数量,从这我们可以看出Blob的存储是以batch为基本单位的;channels表示对应层的通道,比如卷积层有20个卷积核,channels的值就是20;height和width就表示单个数据的尺寸,可能是一副图像的尺寸,也可能表示卷积核的尺寸,在每一层所代表的含义也不相同。

count_:表示这个Blob里已经存储的元素的个数;

capacity_:表示这个Blob的容量;

Blob同时保存了data_和diff_,其类型为SyncedMemory的指针,注意是指针。

Blob中除了数据成员之外,也有很多用于操作数据的函数成员,下面就说几个比较重要的:

void Blob<Dtype>::Reshape():这个函数是在原来分配的内存不够的情况下重新分配内存。

const Dtype* Blob<Dtype>::cpu_data():这个是获取Blob结构体中的data_数据的指针,同时限制不能对返回的指针指向的内容进行更改。

const Dtype* Blob<Dtype>::cpu_diff():这个是获取Blob结构体中的diff_数据的指针,同时限制不能对返回的指针指向的内容进行更改。

Dtype* Blob<Dtype>::mutable_cpu_data():获取Blob结构体中的data_数据的指针,同时可以对指针指向的内容更改。

Dtype* Blob<Dtype>::mutable_cpu_diff():获取Blob结构体中的diff_数据的指针,同时可以对指针指向的内容更改。

void Blob<Dtype>::ShareData(const Blob& other):让其他Blob的data_数据和当前Blob共享。

void Blob<Dtype>::ShareDiff(const Blob& other):让其他Blob的diff_和当前的Blob共享。

在blob.hpp中还有这样几个定义:

按照注释的意思,这几个函数和shape()是一样的作用。shape本身是一个vector,这个vector的size为4,第一个位置存储图片的个数,第二个存储channel的个数,以此类推。

逻辑上看,blob是一个四维数组。但实际上,因为数组的存储是在内存中开辟一块连续的、大小相同的的空间,所以blob的存储应该是一个一维的存储结构。只不过是利用四个参数来进行寻址(shape_里的四个参数)。并且blob是行优先的存储方式。

所以对于一个(n, k, h, w)的blob,他的维度就是n*k*h*w,在(n, k, h, w)位置的值物理位置为((n * K + k) * H + h) * W + w。

以Blob中二维矩阵为例(如全连接网络shape (N, D)),如图所示。同样的存储方式可以推广到多维。

动态多维数组:Blob 类可以动态改变数组的尺寸,当拓展数组导致原有内存空间不足以存放下数据时 (count > capacity),就会重新分配内存。Blob 提供了一组 Reshape 函数来完成这个功能。

void Reshape(const int num, const int channels, const int height, const int width); // Deprecated void Reshape(const vector<int>& shape); void Reshape(const BlobShape& shape); void ReshapeLike(const Blob& other); 

Blob 类在初始化时并没有分配内存,也是通过调用 Reshape 来分配内存的。

template <typename Dtype>
void Blob<Dtype>::Reshape(const vector<int>& shape) {CHECK_LE(shape.size(), kMaxBlobAxes); // 检查维数count_ = 1; // 用于计算新的多维数组的大小shape_.resize(shape.size()); // 更新维数if (!shape_data_ || shape_data_->size() < shape.size() * sizeof(int)) {// shape_data_ 未初始化或者内存太小shape_data_.reset(new SyncedMemory(shape.size() * sizeof(int)));}int* shape_data = static_cast<int*>(shape_data_->mutable_cpu_data());for (int i = 0; i < shape.size(); ++i) {CHECK_GE(shape[i], 0);CHECK_LE(shape[i], INT_MAX / count_) << "blob size exceeds INT_MAX";count_ *= shape[i];shape_[i] = shape[i];shape_data[i] = shape[i];}if (count_ > capacity_) {// 内存不够capacity_ = count_;data_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));diff_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));}
}

http://blog.csdn.net/qq_14975217/article/details/51524042

http://blog.csdn.net/mounty_fsc/article/details/51085654

http://blog.csdn.net/buyi_shizi/article/details/51506853

http://blog.csdn.net/jyl1999xxxx/article/details/53981813

转载于:https://www.cnblogs.com/ymjyqsx/p/7799731.html

caffe blob理解相关推荐

  1. Caffe Blob Dtype理解

    http://blog.luoyetx.com/2015/10/reading-caffe-2/ 关于Blob: Blob 在 Caffe 中扮演了重要的角色,用于存储数据和网络参数,同时也在 CPU ...

  2. caffe blob操作

    http://blog.luoyetx.com/2015/10/reading-caffe-2/ Blob 在 Caffe 中扮演了重要的角色,用于存储数据和网络参数,同时也在 CPU 和 GPU 之 ...

  3. 深度学习Caffe 入门理解使用教程

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先caffe 安装我就不解释了 如果有人安装不会的话 可以加我qq 1050316096 ,我会按照使用方式来介绍,首先 ...

  4. Caffe源码中blob文件分析

    Caffe源码(caffe version commit: 09868ac , date: 2015.08.15)中有一些重要的头文件,这里介绍下include/caffe/blob.hpp文件的内容 ...

  5. 【caffe】基本数据结构blob

    @tags: caffe blob blob是caffe中的基本数据结构,简单理解就是一个"4维数组".但是,这个4维数组有什么意义? BTW,TensorFlow这款google ...

  6. 剖析Caffe源码之Blob

    目录 介绍 用例 Class Blob Blob主要源码分析 Blob构造函数 Blob各个维度大小设置 Blob维度信息获取 Blob计算偏移量 Blob数据存储与读取相关操作 Blob数据操作 B ...

  7. caffe源码导读(二)Blob数据结构介绍

    文章目录 前言 一.先看Blob的数据结构描述 二.Blob基本用法 前言 本篇<深度学习21天实战caffe>这本书的阅读笔记. 打开proto/caffe.proto中,刚开始就是介绍 ...

  8. 「caffe速成」caffe图像分类从模型自定义到测试

    https://www.toutiao.com/a6697741728985645581/ 这一次我们讲讲 Caffe 这个主流的开源框架从训练到测试出结果的全流程.到此,我必须假设大家已经有了深度学 ...

  9. 零基础学caffe源码 ReLU激活函数

    零基础学caffe源码 ReLU激活函数 原创 2016年08月03日 17:30:19 1.如何有效阅读caffe源码 1.caffe源码阅读路线最好是从src/cafffe/proto/caffe ...

最新文章

  1. java中的常用的文件流_Java 基础(四)| IO 流之使用文件流的正确姿势
  2. OpenWRT 随记
  3. 电脑罗盘时钟代码_苹果电脑怎么设置数字时钟屏保 Word Clock for Mac安装教程
  4. 2019年第十届蓝桥杯 - 省赛 - C/C++大学A组 - D. 迷宫
  5. 深度学习用于视频检测_视频如何用于检测您的个性?
  6. 微软中国Azure开源开发者(深圳)研讨会
  7. 串口通讯编程一日通3(COMMTIMEOUTS DCB整理)
  8. MATLAB学习——变量、数组
  9. Lesson 6   Smash-and-grab 砸橱窗抢劫
  10. 中国啮齿动物口器行业市场供需与战略研究报告
  11. 简繁互相切换的字库(比较全)
  12. 现代语音信号处理之语音特征参数估计
  13. 【Windows系统】查看和关闭139、445端口的方法
  14. vue 微信公众号 前端开发
  15. 物联网技术概论:第2章
  16. linux 运行有道词典,Ubuntu中使用有道词典
  17. 单片机中使用三极管驱动蜂鸣器
  18. c++语言表白超炫图形_数学公式的超酷表白我爱你
  19. java8 steam流在当前数据对象上的操作。判断list中的属性值是否符合条件或者不为空,后赋值另一个属性的操作
  20. Mysql优化(一)—Sql语句

热门文章

  1. rank() 和dense_rank() 区别
  2. 你真的会用搜索引擎吗?
  3. Parcelable 相关
  4. 重庆市市长胡衡华会见深兰科技董事长陈海波一行
  5. MAC地址和IP地址的区别,联系和应用范围
  6. Phoenix删除数据
  7. 硬盘损坏有哪些表现?丢失的文件怎么恢复?
  8. 2021年中国生猪养殖产能快速增长,生猪养殖债券新发债券规模同比大幅增加,到期规模远小于发债规模[图]
  9. 世界有哪些古文明拥有自己的独立文字
  10. 2021年高教杯数学建模国赛C题生产企业原材料的订购与运输