caffe原始碼分析:blob.hpp分析
阿新 • • 發佈:2019-01-02
以下摘自網際網路:
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:
資料成員:
protected:
shared_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的申請。