您的位置:首页 > Web前端

caffe源码解析 — blob.cpp

2015-04-17 17:17 316 查看
主要参考:linger

Reshape(const int num, const int channels, const int height, const int width)


功能:改变一个blob的大小

步骤:1.读入num_,channels_,height_,width_的大小

2.计算count_:count_ = num_ * channels_ * height_ * width_;

3.如果count_不为0,则重新为data_和diff_分配一块空间

如果count为0,则都初始化为NULL

输入:num,channels,height,width

输出:无

ReshapeLike(const Blob<Dtype>& other)


功能:为data_和diff_ 重新分配一块空间,大小和另一个blob的一样

输入:Bolb类型的other

输出:无

Blob<Dtype>::Blob(const int num, const int channels, const int height, const int width)


功能:简单的构造函数

输入:num,channels,height,width

set_cpu_data(Dtype* data)


功能:改变CPU的数据

const Dtype* Blob<Dtype>::cpu_data()
const Dtype* Blob<Dtype>::cpu_diff()
const Dtype* Blob<Dtype>::gpu_data()
const Dtype* Blob<Dtype>::gpu_diff()


功能:以上四个函数,前两个调用to_cpu(),返回cpu_ptr;第一个对于data对象,第二个对于diff对象

后两个 调用to_gpu(),返回gpu_ptr;第一个对于data对象,第二个对于diff对象

Dtype* Blob<Dtype>::mutable_cpu_data()
Dtype* Blob<Dtype>::mutable_gpu_data()
Dtype* Blob<Dtype>::mutable_cpu_diff()
Dtype* Blob<Dtype>::mutable_gpu_diff()


功能:下面是gpu_data和mutable_gpu_data函数的对比,可以看出第二个函数

只是多改变了head_的值。

const void* SyncedMemory::gpu_data() {
to_gpu();
return (const void*)gpu_ptr_;
}

void* SyncedMemory::mutable_gpu_data() {
to_gpu();
head_ = HEAD_AT_GPU;
return gpu_ptr_;
}


void Blob<Dtype>::ShareData(const Blob& other)
void Blob<Dtype>::ShareDiff(const Blob& other)


功能:从other的blob复制data和diff的值

Update()


功能:更新data_的数据,就是减去diff_的数据。

步骤:1.判断blob的位置(HEAD_AT_CPU/HEAD_AT_GPU/SYNCED/UNINITIALIZED)

1)调用caffe_axpy:在math_functions.cpp可以找到该函数的实现,其实这函数也是封装了mkl的函数。这里调用是为了实现了两个向量的减法。

2)调用caffe_gpu_axpy:在math_functions.cpp可以找到该函数的实现,其实这函数也是封装了cublas的函数。这里调用是为了实现了两个向量的减法。

CopyFrom(const Blob& source, bool copy_diff, bool reshape)


功能:从source拷贝数据。copy_diff作为标志来区分是拷贝data还是拷贝diff。

步骤:1.如果是GPU:

如果是拷贝diff:调用cudaMemcpy函数将source的diff拷贝过来

否则拷贝data

2.如果是CPU:

如果是拷贝diff:调用memcpy函数将source的diff拷贝过来

否则拷贝data

FromProto(const BlobProto& proto)


功能:从proto读数据进来,其实就是反序列化

步骤:1.先把blob的大小改变一下

2.得到cpu中数据的地址

3.用proto中的data覆盖blob中的data

4.用proto中的diff覆盖blob中的diff

ToProto(BlobProto* proto, bool write_diff)


功能:把blob数据保存到proto中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: