caffe源码阅读(1)-数据流Blob
Blob是Caffe中层之间数据流通的单位,各个layer之间的数据通过Blob传递。在看Blob源码之前,先看一下CPU和GPU内存之间的数据同步类SyncedMemory;使用GPU运算时,数据要在GPU显存中,但是一开始数据是通过CPU读到内存,通过类SyncedMemory来实现显存和内存之间的数据的同步。
SyncedMemory
先看一下成员变量
//数据在cpu或gpu,指向数据的指针
void* cpu_ptr_;
void* gpu_ptr_;
size_t size_;//数据大小
SyncedHead head_;//数据状态,有四种:UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED
bool own_cpu_data_;
bool cpu_malloc_use_cuda_;//是否使用cuda标记
bool own_gpu_data_;
int gpu_device_;
两个指针分别指向在内存和显存的数据,size_记录数据大小,head_是枚举变量,记录数据状态。gpu_device_指出使用哪块显卡。
成员函数根据名字能看出大概意思,其中
void async_gpu_push(const cudaStream_t& stream);
是异步同步数据到GPU,这里的"异步“是指把数据同步到GPU,在同步未完成时就返回,不需要等待完成同步。
CaffeMallocHost/CaffeFreeHost
这是一个功能和malloc/free相同的分配/释放内存/显存的函数。如果使用了GPU,则在在GPU上分配和释放,否则在内存上分配和释放。
Blob
Blob类的成员变量很少
protected:
shared_ptr<SyncedMemory> data_;//存放数据
shared_ptr<SyncedMemory> diff_;//存放梯度
shared_ptr<SyncedMemory> shape_data_;//Blob形状,N K H W
vector<int> shape_;//保存 N K H W
int count_;//元素个数
int capacity_;//当前元素个数
Blob存储着图像数据,以及偏差。图像数据大小由channel、height、width判断,一个Blob可能存储多幅图像,所以多了一个num。即Blob大小有Num,K(channel),Height,Weight决定。
Blob成员函数很多:
Reshape函数用来调整Blob形状,最终调用的函数如下
template <typename Dtype>
void Blob<Dtype>::Reshape(const vector<int>& shape) {
CHECK_LE(shape.size(), kMaxBlobAxes);//维数不能超过kMaxBlobAxes
count_ = 1;//赋值为1,为了相乘
shape_.resize(shape.size());
if (!shape_data_ || shape_data_->size() < shape.size() * sizeof(int)) {
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_) {//capactity不小于count
capacity_ = count_;
data_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));
diff_.reset(new SyncedMemory(capacity_ * sizeof(Dtype)));
}
}
可以看出,如果Reshape时,如果大小不够时,会重新分配内存/显存,释放原有内存/显存。
Update()函数用来更新数据,根据数据所在位置进行更新
template <typename Dtype>
void Blob<Dtype>::Update() {
// We will perform update based on where the data is located.
switch (data_->head()) {
case SyncedMemory::HEAD_AT_CPU:
// perform computation on CPU
//data_ = data_ - diff_
caffe_axpy<Dtype>(count_, Dtype(-1),
static_cast<const Dtype*>(diff_->cpu_data()),
static_cast<Dtype*>(data_->mutable_cpu_data()));
break;
case SyncedMemory::HEAD_AT_GPU:
case SyncedMemory::SYNCED:
#ifndef CPU_ONLY
// perform computation on GPU
//data_ = data_ - diff_
caffe_gpu_axpy<Dtype>(count_, Dtype(-1),
static_cast<const Dtype*>(diff_->gpu_data()),
static_cast<Dtype*>(data_->mutable_gpu_data()));
#else
NO_GPU;
#endif
break;
default:
LOG(FATAL) << "Syncedmem not initialized.";
}
}
Update()函数,实际上进行的运算时data_ = data_ - diff_。
计算范数的函数是特化实现的:
函数asum_data()和asum_diff()是计算data_或diff_的L1范数。
函数sumsq_data()和sumsq_diff()是计算data_或diff_的L1范数。
其他函数根据名字都可以大概理解了。
caffe源码阅读(1)-数据流Blob的更多相关文章
- Caffe源码阅读(1) 全连接层
Caffe源码阅读(1) 全连接层 发表于 2014-09-15 | 今天看全连接层的实现.主要看的是https://github.com/BVLC/caffe/blob/master/src ...
- caffe源码阅读
参考网址:https://www.cnblogs.com/louyihang-loves-baiyan/p/5149628.html 1.caffe代码层次熟悉blob,layer,net,solve ...
- caffe源码阅读(3)-Datalayer
DataLayer是把数据从文件导入到网络的层,从网络定义prototxt文件可以看一下数据层定义 layer { name: "data" type: "Data&qu ...
- Caffe源码解析1:Blob
转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ 首先看到的是Blob这个类,Blob是作为Caffe中数据流通的 ...
- caffe源码阅读(2)-Layer
神经网络是由层组成的,深度神经网络就是层数多了.layer对应神经网络的层.数据以Blob的形式,在不同的layer之间流动.caffe定义的神经网络已protobuf形式定义.例如: layer { ...
- Caffe源码理解1:Blob存储结构与设计
博客:blog.shinelee.me | 博客园 | CSDN Blob作用 据Caffe官方描述: A Blob is a wrapper over the actual data being p ...
- caffe源码阅读(1)_整体框架和简介(摘录)
原文链接:https://www.zhihu.com/question/27982282 1.Caffe代码层次.回答里面有人说熟悉Blob,Layer,Net,Solver这样的几大类,我比较赞同. ...
- caffe 源码阅读
bvlc:Berkeley Vision and Learning Center. 1. 目录结构 models(四个文件夹均有四个文件构成,deploy.prototxt, readme.md, s ...
- caffe源码阅读(一)convert_imageset.cpp注释
PS:本系列为本人初步学习caffe所记,由于理解尚浅,其中多有不足之处和错误之处,有待改正. 一.实现方法 首先,将文件名与它对应的标签用 std::pair 存储起来,其中first存储文件名,s ...
随机推荐
- Spider Studio 数据挖掘集成开发环境
(最新版本: 2.7.12.1) 传统的多线程蜘蛛程序虽然采集速度快, 但是明明不需要所有内容, 却胡子眉毛一把抓, 将整个网页都下载下来当作一个文本进行处理. 由于网页内容参差不齐, 所以抓取质量常 ...
- 配置MySQL主从双向同步
原文地址:http://www.cnblogs.com/zhongshengzhen/ 原主数据库:192.168.137.33 原从数据库:192.168.137.197 需要先阅读并操作:ht ...
- Jsp的三、七、九
1.jsp的三个编译指令 <%page %> <%taglib %> <%include %> 2.jsp的七个动作指令 forward param include ...
- ecshop如何去除后台左侧云服务中心菜单
介绍一下如何去除后台云服务中心菜单: 打开admin/templates/menu.htm,把539行的 document.getElementById("menu-ul").in ...
- IDF实验室-简单编程-特殊的日子 writeup
题目:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=50 题目提示要爆破,代表加密应该是不可逆的. 密文:4D ...
- iOS 有关自动轮播图片
//初始化当前视图 _currentImageView = [[UIImageView alloc] init]; [_currentImageView setImageWithURL:[NSURL ...
- -join 和 -split 用法
具体可参考 PowerShell_ISE的帮助文件: -Join(一元联接运算符): 一元联接运算符 (-join <string[]>) 的优先级高于逗号.因此,如果向一元联接运算符提交 ...
- nape.geom.MarchingSquares
Nape中的MarchingSquares类很简单,只有一个静态函数run,不过这对绘制那些简单的形状来说,已经足够了(当然MarchingSquares能做的不只这些).下面是这个run方法的结构: ...
- hdu 5446 Unknown Treasure lucas和CRT
Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- InSAR在地面沉降监测中的应用及发展前景
合成孔径雷达(Synthetic Aperture Radar,SAR)的概念始于20世纪50年代,是正在发展中的极具潜力的微波遥感技术.SAR具有全天时.全天候的工作能力,能够穿透云层,对某些地物具 ...