前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >caffe源码分析-Blob

caffe源码分析-Blob

作者头像
bear_fish
发布2019-02-25 11:49:49
2K1
发布2019-02-25 11:49:49
举报

本文主要分析caffe源码分析-Blob,主要如下几个方面:

  1. overview整体上了解caffe的Blob
  2. Blob 成员变量
  3. Blob主要函数,核心在于Blob的使用实例以及其与opencv Mat的操作的相互转化(附带运行结果基于CLion)

overview

BlobCaffe作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储,网络,求解器等都是直接与此结构打交道的。

其直观的可以把它看成一个有4维的结构体(包含数据和梯度),而实际上,它们只是一维的指针而已,其4维结构通过shape属性得以计算出来(根据C语言的数据顺序)。

Blob在也不一定全是4维的,例如全连接层的参数就没有用四维,后期的版本已经deprecated,而是直接用vector<int> shape_


成员变量

Blob中的主要数据成员如下,实际是在SyncedMemory上做了一层包装(SyncedMemory介绍见上一篇blog):


主要函数

主要分析如下几类函数:

  1. 构造函数, 以及Reshape函数()
  2. 索引、返回N、C、H、W相关函数
  3. gpu、cpu同步函数, 以及数据的获取
  4. 简单的数据处理如scale_data对数据缩放(底层调用了cblas库的运算)
  5. Blob的示例,数据赋值以及和opencv Mat的操作
  6. Blob对应的protobuf结构体BlobShape、BlobProto、BlobProtoVector
1. 构造函数, 以及Reshape函数()

构造函数分类两种类型:

  1. 默认的什么参数
  2. 传入N、C、H、W构造,最终调用Reshape函数

下面重点看下Reshape函数

上面注意的是:shape_data_是历史版本的shape, new SyncedMemory(shape.size() * sizeof(int))并不分配实际的内存。shape_data_->mutable_cpu_data()获取实际的data,如果没有分配内存则分配。

mutable_cpu_data,根据head_的枚举状态判断是否已经分配了内存。

注:Reshape函数除了被构造函数调用外,也常常作为一般的函数调用,例如对网络的输入的改变:

2. 索引、返回N、C、H、W相关函数

计数 :

3. gpu、cpu同步函数, 以及数据的获取

首先给出一个ReLULayer的前馈函数的示例(里面用到了Blob两个函数cpu_data, mutable_cpu_data一个获取可变的数据,一个不可变。)

template

下面给出一些简单的示例:

4. 简单的数据处理如scale_data对数据缩放(底层调用了cblas库的运算)

下面简单看下scale_data对data_乘上某个因子(主要是cpu的实现):

caffe_scal底层调用的是cblas的cblas_sscal函数(此处用了模板的特化):

最后注意下Blob的显示模板实例化:int,unsigned int,float,double:

Blob无法被copy以及赋值:

5. Blob的示例,数据赋值以及和opencv Mat的操作

简单的Blob赋值示例如下:

运行结果输出如下:

接下来给出一个示例:

  1. 使用opencv Mat创建一个白色的图片,然后将Mat转化为Blob
  2. 使用Blob操作在图片中间画一条黑线,最后将Blob转化为opencv的Mat

运行结果如下:

转换函数如下:

Blob不仅仅限于(N, C, H, W)四维的数据,还可以定义一维的(如在全连接层inner_product_layer中的bias_multiplier_就是一维的),示例如下:

6. Blob对应的protobuf结构体

shape结构体:

Blob结构体BlobProto:

注意的是:BlobProto中定义了float,double两种data(data,double_data),这在Blob中的ToProto函数(blob数据序列化保存到proto),定义了两个模板特化:

其中double特化如下:

float类型同理:


caffe系列源码分析介绍

本系列深度学习框架caffe 源码分析主要内容如下:

1. caffe源码分析-cmake 工程构建:

caffe源码分析-cmake 工程构建主要内容:

自己从头构建一遍工程,这样能让我更好的了解大型的项目的构建。当然原始的caffe的构建感觉还是比较复杂(主要是cmake),我这里仅仅使用cmake构建,而且简化点,当然最重要的是支持CLion直接运行调试(如果需要这个工程可以评论留下你的邮箱,我给你发送过去)。

2. caffe的数据内存分配类SyncedMemory, 以及类Blob数据传输的媒介.

主要内容:

caffe源码分析-SyncedMemory

caffe源码分析-Blob

其中Blob分析给出了其直接与opencv的图片相互转化以及操作,可以使得我们更好的理解Blob.

3. caffe layer的源码分析,包括从整体上说明了layer类别以及其proto定义与核心函数.

内容如下:

caffe源码分析-layer

caffe源码分析-ReLULayer

caffe源码分析-inner_product_layer

caffe源码分析-layer_factory

首先分析了最简单的layer Relu,然后在是inner_product_layer全连接层, 最后是layer_factorycaffe中 以此工厂模式create各种Layer.

4. 数据输入层,主要是多线程+BlockingQueue的方式读取数据训练:

内容如下:

caffe源码分析-BlockingQueue

caffe源码分析-InternalThread

caffe源码分析-DataReader

5. IO处理例如读取proto文件转化为网络,以及网络参数的序列化

内容如下:

caffe源码分析-DataTransformer

caffe源码分析-db, io

6. 最后给出了使用纯C++结合多层感知机网络训练mnist的示例

内容如下:

caffe c++示例(mnist 多层感知机c++训练,测试)

类似与caffe一样按照layer、solver、loss、net等模块构建的神经网络实现可以见下面这篇blog,相信看懂了这个python的代码理解caffe框架会更简单点.

神经网络python实现


最后如果需要**cmake** + CLion**直接运行调试**caffe**的代码工程,可以评论留下你的邮箱,我给你发送过去.**

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年09月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • overview
  • 成员变量
  • 主要函数
    • 1. 构造函数, 以及Reshape函数()
      • 2. 索引、返回N、C、H、W相关函数
        • 3. gpu、cpu同步函数, 以及数据的获取
          • 4. 简单的数据处理如scale_data对数据缩放(底层调用了cblas库的运算)
            • 5. Blob的示例,数据赋值以及和opencv Mat的操作
              • 6. Blob对应的protobuf结构体
                • 1. caffe源码分析-cmake 工程构建:
                • 2. caffe的数据内存分配类SyncedMemory, 以及类Blob数据传输的媒介.
                • 3. caffe layer的源码分析,包括从整体上说明了layer类别以及其proto定义与核心函数.
                • 4. 数据输入层,主要是多线程+BlockingQueue的方式读取数据训练:
                • 5. IO处理例如读取proto文件转化为网络,以及网络参数的序列化
                • 6. 最后给出了使用纯C++结合多层感知机网络训练mnist的示例
            • caffe系列源码分析介绍
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档