本文主要分析caffe
源码分析-Blob
,主要如下几个方面:
Blob
主要函数,核心在于Blob的使用实例以及其与opencv
Mat
的操作的相互转化(附带运行结果基于CLion
)Blob
是Caffe
作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob
数据结构来存储,网络,求解器等都是直接与此结构打交道的。
其直观的可以把它看成一个有4维的结构体(包含数据和梯度),而实际上,它们只是一维的指针而已,其4维结构通过shape属性得以计算出来(根据C语言的数据顺序)。
Blob在也不一定全是4维的,例如全连接层的参数就没有用四维,后期的版本已经deprecated,而是直接用
vector<int> shape_
Blob中的主要数据成员如下,实际是在SyncedMemory上做了一层包装(SyncedMemory介绍见上一篇blog):
主要分析如下几类函数:
构造函数分类两种类型:
下面重点看下Reshape函数
上面注意的是:shape_data_是历史版本的shape, new SyncedMemory(shape.size() * sizeof(int))并不分配实际的内存。shape_data_->mutable_cpu_data()获取实际的data,如果没有分配内存则分配。
mutable_cpu_data,根据head_的枚举状态判断是否已经分配了内存。
注:Reshape函数除了被构造函数调用外,也常常作为一般的函数调用,例如对网络的输入的改变:
计数 :
首先给出一个ReLULayer的前馈函数的示例(里面用到了Blob两个函数cpu_data, mutable_cpu_data一个获取可变的数据,一个不可变。)
template
下面给出一些简单的示例:
下面简单看下scale_data对data_乘上某个因子(主要是cpu的实现):
caffe_scal底层调用的是cblas的cblas_sscal函数(此处用了模板的特化):
最后注意下Blob的显示模板实例化:int,unsigned int,float,double:
Blob无法被copy以及赋值:
简单的Blob赋值示例如下:
运行结果输出如下:
接下来给出一个示例:
运行结果如下:
转换函数如下:
Blob不仅仅限于(N, C, H, W)四维的数据,还可以定义一维的(如在全连接层inner_product_layer中的bias_multiplier_就是一维的),示例如下:
shape结构体:
Blob结构体BlobProto:
注意的是:BlobProto中定义了float,double两种data(data,double_data),这在Blob中的ToProto函数(blob数据序列化保存到proto),定义了两个模板特化:
其中double特化如下:
float类型同理:
caffe
系列源码分析介绍本系列深度学习框架caffe
源码分析主要内容如下:
caffe源码分析-cmake 工程构建主要内容:
自己从头构建一遍工程,这样能让我更好的了解大型的项目的构建。当然原始的caffe的构建感觉还是比较复杂(主要是cmake),我这里仅仅使用cmake构建,而且简化点,当然最重要的是支持CLion直接运行调试(如果需要这个工程可以评论留下你的邮箱,我给你发送过去)。
SyncedMemory
, 以及类Blob
数据传输的媒介.主要内容:
其中Blob
分析给出了其直接与opencv的图片相互转化以及操作,可以使得我们更好的理解Blob
.
layer
的源码分析,包括从整体上说明了layer
类别以及其proto定义与核心函数.内容如下:
首先分析了最简单的layer
Relu
,然后在是inner_product_layer全连接层
, 最后是layer_factory
caffe中 以此工厂模式create各种Layer.
内容如下:
内容如下:
内容如下:
caffe c++示例(mnist 多层感知机c++训练,测试)
类似与caffe
一样按照layer、solver、loss、net
等模块构建的神经网络实现可以见下面这篇blog,相信看懂了这个python的代码理解caffe框架会更简单点.
最后如果需要**cmake
** + CLion
**直接运行调试**caffe
**的代码工程,可以评论留下你的邮箱,我给你发送过去.**