1. 程式人生 > >caffe原始碼分析:blob.hpp分析

caffe原始碼分析:blob.hpp分析

以下摘自網際網路:
Blob作為Caffe的四大模組之一,負責完成CPU/GPU儲存申請、同步和資料持久化對映。Caffe內部資料儲存和通訊都是通過Blob來完成,Blob提供統一的儲存操作介面,可用來儲存訓練資料、模型引數等。Blob是一個高維連續陣列,批處理影象資料時通常使用4維Blob,Blob的維度可以表示為(N, K, H, W),每個維度的意思分別是:

  • N: 資料的個數,例如SGD時一次mini-batch的影象個數。
  • K: 如果是影象,可以理解為通道數量;如果是網路中間結果,就是feature map的數量。
  • H, W: 如果是影象資料,可以理解為影象的高度和寬度;如果是引數資料,可以理解為濾波核的高度和寬度。

Caffe中通常只使用4維Blob完成影象應用,但是Blob完全可以合理地被用來儲存任何資料,比如說學習到的引數。
例如:

  • 1000幅640*480 RGBD影象資料,其Blob形狀為(1000, 4, 480, 640)。
  • 96個大小11*11的濾波核,處理16通道的輸入資料,其引數Blob的形狀為(96,16,11,11)。
  • 1000個輸出,1024個輸入的全連線層,其引數Blob的形狀為(1000,1024)。

blob.hpp:
資料成員:

protectedshared_ptr<SyncedMemory> data_; //存放資料 
shared_ptr<SyncedMemory> diff_; //存放梯度
shared_ptr<SyncedMemory> shape_data_; vector<int> shape_;//shape_是Blob維度引數 int count_;//count表示Blob儲存的元素個數(shape_所有元素乘積) int capacity_;//capacity_表示當前Blob的元素個數(控制動態分配)

建構函式:
預設建構函式完成最基本的初始化,兩個顯示建構函式會呼叫Reshape函式完成data_和diff_的共享記憶體物件SyncedMemory的申請。

const Dtype* cpu_data() const; //cpu使用的資料
void set_cpu_data(Dtype* data); //用資料塊的值來blob裡面的data const int* gpu_shape() const; const Dtype* gpu_data() const; //返回不可更改的指標,下同 const Dtype* cpu_diff() const; const Dtype* gpu_diff() const; Dtype* mutable_cpu_data(); //返回可更改的指標,下同 Dtype* mutable_gpu_data(); Dtype* mutable_cpu_diff(); Dtype* mutable_gpu_diff();

總之,帶mutable_開頭的意味著可以對返回的指標內容進行更改,而不帶mutable_開頭的返回const 指標,不能對其指標的內容進行修改
Reshape函式:

void Reshape(const vector<int>& shape);//主要完成資料成員shape_,shape_data_,count_,capacity_,data_,diff_最基本的初始化工作,主要包括記憶體分配,含初始化。
void Reshape(const BlobShape& shape);//特別是完成data_,diff_的共享記憶體物件SyncedMemory的申請。