Blob是caffe中每一层的基本类型。
查看头文件:
template <typename Dtype>
class Blob {
public:
Blob(): data_(), diff_(), count_(0), capacity_(0) {}
...
protected:
shared_ptr<SyncedMemory> data_;
shared_ptr<SyncedMemory> diff_;
shared_ptr<SyncedMemory> shape_data_;
vector<int> shape_;
int count_;
int capacity_;
Blob类和caffe中大多类一样是模板函数, 其实Dtype在caffe中一般是float 或 double类型。 一般可以不用管它是float或是double类型,但我遇到过Dtype类型不匹配的情况,这个时候我目前只发现使用Dtype类型强制转换,将其他类型转为Dtype。
看Blob类下的几个变量。data_显然是这一层的数值张量(the data of this layer), diff_显然是相应的微分值。 至于shape_data_ 和shape_ 应该都是layer的shape,一般是四维的。count_ 是这一层data总数, count_ = width*height*channel*num , capacity_则是当前申请的空间容纳的data数。
SyncedMemory 是caffe的一个基本类型,如上面代码:data,diff 都是SyncedMemory类型。
class SyncedMemory {
private:
void to_cpu();
void to_gpu();
void* cpu_ptr_;
void* gpu_ptr_;
size_t size_;
SyncedHead head_;
bool own_cpu_data_;
bool cpu_malloc_use_cuda_;
bool own_gpu_data_;
int gpu_device_;
}
SyncedMemory类主要干的是 分配cpu数据, gpu数据, 数据从cpu传到gpu, 从gpu传到cpu之类的。注意到有void指针, void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。

本文详细介绍了Caffe框架中Blob类的作用及其实现原理,包括其内部存储结构data_、diff_等成员变量的功能。同时,还深入探讨了SyncedMemory类在CPU与GPU间同步数据的机制。

390

被折叠的 条评论
为什么被折叠?



