caffe目錄結(jié)構(gòu)
- docs —— 幫助文檔
- examples —— 代碼樣例
- matlab —— MATLAB接口文件
- python —— PYTHON接口文件
- models —— 一些配置好的模型參數(shù)
- scripts —— 一些文檔和數(shù)據(jù)會用到的腳本
- 核心代碼:
- tools —— 保存的源碼是用于生成二進制處理程序的封恰,caffe在訓(xùn)練時實際是直接調(diào)用這些二進制文件
- include —— Caffe的實現(xiàn)代碼的頭文件
- src —— 實現(xiàn)Caffe的源文
- gtest —— google test一個用于測試的庫. 你make runtest時看見的很多綠色RUN OK就是它游沿,這個與caffe的學(xué)習(xí)無關(guān)尸折,不過是個有用的庫
- caffe —— 關(guān)鍵代碼:
- test —— 用gtest測試caffe的代碼
- util —— 數(shù)據(jù)轉(zhuǎn)換時用的一些代碼浅缸。caffe速度快换薄,很大程度得益于內(nèi)存設(shè)計上的優(yōu)化(blob數(shù)據(jù)結(jié)構(gòu)采用proto)和對卷積的優(yōu)化(部分與im2col相關(guān))
- proto —— 即所謂的“Protobuf”早歇,全稱“Google Protocol Buffer”多柑,是一種數(shù)據(jù)存儲格式遥椿,幫助caffe提速
- layers —— 深度神經(jīng)網(wǎng)絡(luò)中的基本結(jié)構(gòu)就是一層層互不相同的網(wǎng)絡(luò)了堰燎,這個文件夾下的源文件以及目前位置“src/caffe”中包含所有.cpp文件就是caffe的核心目錄下的核心代碼了掏父。
- caffe最核心的代碼:
- blob[.cpp .h] —— 基本的數(shù)據(jù)結(jié)構(gòu)Blob類
- common[.cpp .h] —— 定義Caffe類
- internal_thread[.cpp .h]—— 使用boost::thread線程庫
- net[.cpp .h] —— 網(wǎng)絡(luò)結(jié)構(gòu)類Net
- solver[.cpp .h] —— 優(yōu)化方法類Solver
- data_transformer[.cpp .h] —— 輸入數(shù)據(jù)的基本操作類DataTransformer
- syncedmem[.cpp .h] —— 分配內(nèi)存和釋放內(nèi)存類CaffeMallocHost,用于同步GPU秆剪,CPU數(shù)據(jù)
- layer[.cpp .h] —— 層類Layer
- layers —— 此文件夾下面的代碼全部至少繼承了類Layer, 從layer_factory中注冊繼承
caffe的三級機構(gòu)(Blobs,Layers,Nets)
Blobs,Layers,Nets關(guān)系概述:Caff的net比作一棟大樓赊淑,Layer是構(gòu)成大樓的墻,Blob是構(gòu)成墻的磚塊
-
功能概括:
- Blob:用于數(shù)據(jù)的保存仅讽、交換和操作陶缺,Caffe基礎(chǔ)存儲結(jié)構(gòu)
- Layer:用于模型和計算的基礎(chǔ)
- Net:整合連接layers
-
具體介紹:
- Blob:是caffe中處理和傳遞實際數(shù)據(jù)的數(shù)據(jù)封裝包。是按C風(fēng)格連續(xù)儲存的N維數(shù)組洁灵。
常規(guī)的維度為圖像數(shù)量N通道數(shù)C圖像高度H*圖像寬度W饱岸。
-
主要變量:
- shared_ptr data_;
- shared_ptr diff_;
- shared_ptr shape_data_;
- vector shape_;
- int count_;
- int capacity_;
-
解釋:
- shared_ptr——是一個數(shù)據(jù)boost庫中的智能指針,主要用來申請內(nèi)存
- data_主要是正向傳播時候用的徽千,diff_主要是用來儲存偏差(主要是反向傳播的時候會用到)苫费,
- shape_data和shape_——都是存儲Blob的形狀
- count——表示Blob存儲的元素個數(shù),也就是個數(shù)*通道數(shù)*高度*寬度
- capacity_——表示當(dāng)前Blob的元素個數(shù)(控制動態(tài)分配)
-
主要函數(shù):
- 構(gòu)造函數(shù):構(gòu)造函數(shù)開辟一個內(nèi)存空間來存儲數(shù)據(jù)
- reshape函數(shù):Reshape函數(shù)在Layer中的reshape或者forward操作中來adjust dimension
- count函數(shù):重載很多個count()函數(shù)罐栈,主要還是為了統(tǒng)計Blob的容量(volume)黍衙,或者是某一片(slice),從某個axis到具體某個axis的shape乘積(如 “ inline int count(int start_axis, int end_axis)”)荠诬。
- data_數(shù)據(jù)操作函數(shù) & 反向傳播導(dǎo)數(shù)diff_操作函數(shù):這一部分函數(shù)主要通過給定的位置訪問數(shù)據(jù)琅翻,根據(jù)位置計算與數(shù)據(jù)起始的偏差offset,在通過cpu_data*指針獲得地址
- FromProto/ToProto數(shù)據(jù)序列化:將數(shù)據(jù)序列化柑贞,存儲到BlobProto方椎,這里說到Proto是谷歌的一個數(shù)據(jù)序列化的存儲格式,可以實現(xiàn)語言钧嘶、平臺無關(guān)棠众、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
- Update函數(shù):該函數(shù)用于參數(shù)blob的更新(weight,bias 等減去對應(yīng)的導(dǎo)數(shù))
- 其他運算函數(shù):
- Dtype asum_data() const;//計算data的L1范數(shù)(所有元素絕對值之和)
- Dtype asum_diff() const;//計算diff的L1范數(shù)
- Dtype sumsq_data() const;//計算data的L2范數(shù)(所有元素平方和)
- Dtype sumsq_diff() const;//計算diff的L2范數(shù)
- void scale_data(Dtype scale_factor);//將data部分乘以一個因子
- void scale_diff(Dtype scale_factor);//將diff部分乘一個因子
- layer:
簡介:
所有的Pooling(池化)闸拿,Convolve(卷積)空盼,apply nonlinearities等操作都在這里實現(xiàn)。在Layer中input data用bottom,表示output data用top表示新荤。每一層定義了三種操作setup(Layer初始化), forward(正向傳導(dǎo)揽趾,根據(jù)input計算output), backward(反向傳導(dǎo)計算,根據(jù)output計算input的梯度)苛骨。forward和backward有GPU和CPU兩個版本的實現(xiàn)篱瞎。-
caffe中已經(jīng)衍生了很多不同功能作用的layer, 其中常用的五種layer:
- data_layer(數(shù)據(jù)層)
-
data_layer主要包含與數(shù)據(jù)有關(guān)的文件。在官方文檔中指出data是caffe數(shù)據(jù)的入口是網(wǎng)絡(luò)的最低層痒芝,并且支持多種格式俐筋,在這之中又有5種LayerType:
- DATA 用于LevelDB或LMDB數(shù)據(jù)格式的輸入的類型,輸入?yún)?shù)有source, batch_size, (rand_skip), (backend)严衬。后兩個是可選澄者。
- EMORY_DATA 這種類型可以直接從內(nèi)存讀取數(shù)據(jù)使用時需要調(diào)用MemoryDataLayer::Reset,輸入?yún)?shù)有batch_size, channels, height, width请琳。
- DF5_DATA HDF5數(shù)據(jù)格式輸入的類型闷哆,輸入?yún)?shù)有source, batch_size。
- HDF5_OUTPUT HDF5數(shù)據(jù)格式輸出的類型单起,輸入?yún)?shù)有file_name抱怔。
- IMAGE_DATA 圖像格式數(shù)據(jù)輸入的類型,輸入?yún)?shù)有source, batch_size, (rand_skip), (shuffle), (new_height), (new_width)嘀倒。
其實還有兩種WINDOW_DATA, DUMMY_DATA用于測試和預(yù)留的接口,不重要屈留。
-
- neuron_layer(數(shù)據(jù)的操作層)
neuron_layer實現(xiàn)里大量激活函數(shù),主要是元素級別的操作测蘑,具有相同的bottom,top size灌危。 - loss_layer(損失層/計算網(wǎng)絡(luò)誤差層)
可以看見調(diào)用了neuron_layers.hpp,估計是需要調(diào)用里面的函數(shù)計算Loss碳胳,一般來說Loss放在最后一層勇蝙。caffe實現(xiàn)了大量loss function,它們的父類都是LossLayer挨约。
-
common_layer
- 這一層主要進行的是vision_layer的連接
- 聲明了9個類型的common_layer味混,部分有GPU實現(xiàn):
- InnerProductLayer 常常用來作為全連接層
- SplitLayer 用于一輸入對多輸出的場合(對blob)
- FlattenLayer 將n * c * h * w變成向量的格式n * ( c * h * w ) * 1 * 1
- ConcatLayer 用于多輸入一輸出的場合
- SilenceLayer 用于一輸入對多輸出的場合(對layer)
- (Elementwise Operations) 這里面是我們常說的激活函數(shù)層Activation Layers。
- EltwiseLayer
- SoftmaxLayer
- ArgMaxLayer
- MVNLayer
-
vision_layer
- 主要是實現(xiàn)Convolution和Pooling操作, 主要有以下幾個類:
- ConvolutionLayer 最常用的卷積操作
- Im2colLayer 與MATLAB里面的im2col類似诫惭,即image-to-column transformation翁锡,轉(zhuǎn)換后方便卷積計算
- LRNLayer 全稱local response normalization layer,在Hinton論文中有詳細(xì)介紹ImageNet.
Classification with Deep Convolutional Neural Networks 夕土。 - PoolingLayer Pooling操作
- 主要是實現(xiàn)Convolution和Pooling操作, 主要有以下幾個類:
- data_layer(數(shù)據(jù)層)
- Net
Net由一系列的Layer組成(無回路有向圖DAG)馆衔,Layer之間的連接由一個文本文件描述瘟判。模型初始化Net::Init()會產(chǎn)生blob和layer并調(diào)用Layer::SetUp。在此過程中Net會報告初始化進程角溃。這里的初始化與設(shè)備無關(guān)拷获,在初始化之后通過Caffe::set_mode()設(shè)置Caffe::mode()來選擇運行平臺CPU或GPU,結(jié)果是相同的减细。
-
Protocol Buffer
- Protocol Buffer(PB)是一種輕便刀诬、高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化邪财,很適合做數(shù)據(jù)存儲或 RPC 數(shù)據(jù)交換格式。它可用于通訊協(xié)議质欲、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)树埠、平臺無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式嘶伟。是一種效率和兼容性都很優(yōu)秀的二進制數(shù)據(jù)傳輸格式怎憋,目前提供了 C++、Java九昧、Python 三種語言的 API绊袋。Caffe采用的是C++和Python的API。
- Blob:是caffe中處理和傳遞實際數(shù)據(jù)的數(shù)據(jù)封裝包。是按C風(fēng)格連續(xù)儲存的N維數(shù)組洁灵。