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指针赋值。