caffe學習(1):多平臺下安裝配置caffe

如何在 centos 7.3 上安裝 caffe 深度學習工具

 

 有好多朋友在安裝 caffe 時遇到很多問題。(看文章的朋友但願關心一下個人創業項目趣智思成) 今天測試並整理一下安裝過程。我是在阿里雲上測試,選擇centos 7.3 鏡像。php

先安裝 epel 源html

1
yum  install  epel-release

安裝基本編譯環境python

1
2
yum  install  protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel
yum  install  gflags-devel glog-devel lmdb-devel<br>yum  install  atlas-devel<br> #用默認的 atlas 有點問題,須要改成 openblas
1
2
3
4
yum  install  openblas-devel<br>
yum  install  python34-devel
yum  install  git
yum groupinstall  "Development Tools"  "Development Libraries"

下載源代碼linux

1
git clone https: //github .com /BVLC/caffe

到源代碼目錄下執行git

1
mv  Makefile.config.example Makefile.config

修改配置文件 Makefile.config
全部不是#開頭的都須要修改github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1
 
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS :=  open  
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
#BLAS_LIB := /path/to/your/blas
BLAS_INCLUDE :=  /usr/include/openblas
BLAS_LIB :=  /usr/lib64

最後在 caffe 目錄下運行:build。就完成了。有任何問題歡迎發在評論區。web

 

 

 

caffe學習(1):多平臺下安裝配置caffe

提到deep learning, caffe的大名天然是如雷貫耳,固然,除了caffe以外,還有不少其餘的框架,如torch,mxnet...可是,就我本身這一個月的實驗以及師兄的結論都是,caffe得出的實驗performance要高於別的框架,多是C++的威力吧~笑算法

OK,接下來準備在這個系列分享我使用和學習caffe的一些經驗,首先天然是框架的配置了。這裏咱們分享一下在windows10和ubuntu14.04虛擬機下的Caffe配置(:編程

一.Windows10 CUDA7.5 VS2013環境

1.軟件準備ubuntu

1.我使用的是系統是win10,首先要確保下載安裝好visual stdio 2013,community版本下載連接在這,2014-Nov 12 Release Notes,這裏建議你們最好將VS安裝在默認C盤位置,否則以後編譯可能會出現各類莫名其妙的問題

2.GitHub - BVLC/caffe at windows 這是微軟修改的caffe windows版本,集成了caffe編譯須要的第三方庫,使用起來很是方便!下載好以後解壓到任意位置,我這裏是放在D盤下,接下來,到windows目錄下,copy一份CommonSettings.props.example到CommonSettings.props

而後用vs打開CommonSettings.props,

我這裏是默認使用GPU,CUDA版本爲7.5,支持python的配置,你們能夠根據本身須要進行調整,GPU對應CUDA版本和CudaArchitecture大體以下圖

注意若是須要使用python接口的話,推薦安裝Miniconda 2.7 64-bit Windows installer(from Miniconda website)或者是Anaconda 2.7 64-bit Windows installer(Download Anaconda Now!)

而後對應修改CommonSettings.props,我這裏安裝的是Anaconda2

3.接下來就是一些軟件的安裝了,首先下載CUDA,能夠根據本身的GPU版本下載對應版本的CUDA,我這裏下載的是CUDA7.5:

下載完成以後就能夠安裝了,這裏也是建議安裝在默認位置,等待解壓完成選擇默認設置,等待安裝完成便可.而後是CUDNN, ,貌似須要註冊以後才能下載,應該不是很費事,下載cudnn v4下載完成後,把解壓後的文件夾中的bin,lib/x64,include中的內容分別放至 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5中的bin,lib/x64,include三個子目錄下,這是%CUDA_PATH%路徑,若是不太肯定能夠去系統環境變量下查看,最後就是Anaconda2了,下載完成以後打開cmd,輸入如下命令安裝一些python庫

conda install --yes numpy scipy matplotlib scikit-image pip
pip install protobuf

至此,全部準備工做都已經完成了!

2.Caffe編譯

打開D:\caffe-windows下的caffe.sln,將編譯選項切換成Release

我這裏刪除了一些之後通常不會用到的工程,其實最主要的是caffe,libcaffe,pycaffe這三個,加快編譯速度.而後咱們先編譯libcaffe,通常這個不出問題整個安裝就沒什麼問題了。

最開始VS可能會比較卡,這是在安裝一些第三方庫(opencv,boost之類的,microsoft用Nuget集成在了這一步),安裝完成以後在D:\NugetPackages下的這些都是caffe編譯所需的第三方庫

而後默默等待編譯完成便可,大約須要十分鐘

看到這裏以後,此次安裝基本上已經成功了.接下來編譯剩下的便可

大功告成!

3.配置和使用

編譯完成後,接下來作一些簡單的配置:

1.首先,編譯完成後的全部文件都在D:\caffe-windows\Build\x64\Release目錄下,

裏面包含最重要的就是caffe.exe以及pycaffe,若是須要在別的機器上使用的話,只須要將Release文件夾拷貝過去便可,不須要再從新編譯一遍

2.接下來咱們作一些簡單設置,首先打開環境變量設置,

在user variables下新建PATH和PYTHONPATH,填寫對應的文件路徑,這樣就能夠便捷使用caffe和caffe python接口了,配置好以後咱們打開cmd,先輸入caffe,在python中import caffe,若是都不報錯——證實你能夠愉快的進入deep learning的殿堂了^_^

3.安裝git for windows,對於習慣Linux系統的人使用這個會更加方便,固然你只用命令行也能夠,這個是可選項

4.測試

下面咱們在mnist數據集上作測試,MNIST handwritten digit database, Yann LeCun, Corinna Cortes and Chris Burge在這裏下載這四個文件,解壓到D:\caffe-windows\data\mnist中右鍵打開git bash here,輸入:

../../Build/x64/Release/convert_mnist_data train-images.idx3-ubyte train-labels.idx1-ubyte mnist_train_lmdb
../../Build/x64/Release/convert_mnist_data t10k-images.idx3-ubyte t10k-labels.idx1-ubyte mnist_test_lmdb

這樣,訓練集和測試集就建立好了,將其拷貝至D:\caffe-windows\examples\mnist目錄下

進入該目錄,打開lenet_train_test.prototxt,修改以下

而後打開lenet_solver.prototxt,修改第二行便可,

這裏暫時不對這些配置文件作解釋,只是安裝完以後進行的測試,ok下面打開bash:

caffe train -solver=lenet_solver.prototxt -gpu 0 

接着就能夠看到一大串log出現,好像很厲害的樣子!

最後在測試集上的結果是99.13%!深度學習,很強勢!

好了,windows下的安裝配置就到這裏告一段落了,訓練大多數模型都已經沒問題了

二.VM Ubuntu14.04下安裝CPU版本的Caffe

大多數狀況下,windows環境下的caffe可以完美完成Linux下caffe的功能了,但畢竟Linux是標準平臺,網上的不少開源代碼都是基於Linux下的caffe的,好比神經網絡可視化工具deepvis,以及RGB大神的RCNN系列,並且大部分狀況下只須要應用到Caffe在CPU下的版本,因此這裏給出虛擬機下ubuntu14.04下安裝caffe的過程

1.建立虛擬機

這裏我使用虛擬機軟件是VirtualBox.首先建立一個linux/ubuntu14.04/64位/4GB內存的名爲caffe的虛擬機,這裏內存官網建議是8GB,可是筆記本總內存才8GB,你們有條件的建議分8GB

接下來一路下一步,

建立後點擊啓動,選擇鏡像,點擊啓動,

下面就是建立虛擬機的一些常見操做了,貼幾張關鍵的圖吧

點擊continue後,漫長的等待。。。

重啓以後,咱們先安裝一下VBox Additions:

選擇設備下的安裝加強功能,在終端中輸入

cd /media/<USER>/VBOXADDITIONS_4.3.16_95972 (where <USER> is your user name) sudo ./VBoxLinuxAdditions.run 

在Virtual Box Manager, 點擊Settings, 而後選擇常規 | 高級 | 共享剪切板 | 雙向,而後選擇重啓,這樣虛擬機就能夠充滿全屏了,再也不是一小塊

2.準備工做

首先安裝必要的環境:

sudo apt-get update #更新軟件列表 sudo apt-get upgrade #更新軟件 sudo apt-get install build-essential #安裝build essentials sudo apt-get install linux-headers-`uname -r` #安裝最新版本的kernel headers 

注意:官網缺乏前兩步,會致使CUDA安裝失敗

這也是個漫長的步驟,默默等待。。。

而後下載cuda7.5:

sudo apt-get install curl
cd Downloads/ curl -O "http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_7.5.18_linux.run" 

這又是個漫長的過程。。。若是嫌這種方式太慢,能夠去官網直接下載,而後複製進虛擬機,不過這種方式有時會出現一點問題

chmod +x cuda_7.5.18_linux.run #使其可運行
sudo ./cuda_7.5.18_linux.run #運行

說明:安裝的過程當中會顯示最終用戶許可協議(EULA),很長,能夠按‘q’退出閱讀,而後安裝的時候不要安裝顯卡驅動,由於虛擬機是無法使用GPU的,具體以下:

  • Accept the EULA
  • Do NOT install the graphics card drivers (since we are in a virtual machine)
  • Install the toolkit (leave path at default)
  • Install symbolic link
  • Install samples (leave path at default)

而後更新相應的庫路徑:

echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib' >> ~/.bashrc source ~/.bashrc 

安裝必要的依賴庫:

sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler gfortran libjpeg62 libfreeimage-dev libatlas-base-dev git python-dev python-pip libgoogle-glog-dev libbz2-dev libxml2-dev libxslt-dev libffi-dev libssl-dev libgflags-dev liblmdb-dev python-yaml
sudo easy_install pillow

下載Caffe並安裝Python依賴庫

cd ~ git clone https://github.com/BVLC/caffe.git cd caffe cat python/requirements.txt | xargs -L 1 sudo pip install 

漫長的等待。。。

增長符號連接

sudo ln -s /usr/include/python2.7/ /usr/local/include/python2.7  
sudo ln -s /usr/local/lib/python2.7/dist-packages/numpy/core/include/numpy/ /usr/local/include/python2.7/numpy

而後修改Makefile.config

cp Makefile.config.example Makefile.config

用gedit打開Makefile.config(或者直接用vim在終端中打開修改也能夠)

1)去掉 # CPU_ONLY: = 1 的註釋

2)在PYTHON_INCLUDE下, 把/usr/lib/python2.7/dist-packages/numpy/core/include替換成/usr/local/lib/python2.7/dist-packages/numpy/core/include

3.編譯Caffe

終於能夠編譯caffe了,這三句便可,若是前面配置一切正常,這裏應該不會出錯

make pycaffe  
make all  
make test 

依然是等待。。。

4.測試

這裏咱們測試一下CPU下的caffe可否正常運行便可:

首先爲方便使用,咱們將PYTHONPATH寫入.bashrc中:

echo 'export PYTHONPATH=/home/<USER>/caffe/python' >> ~/.bashrc source ~/.bashrc 

而後在終端中輸入:python和import caffe

一切正常

下面測試一下mnist數據集:

cd ~/caffe ./data/mnist/get_mnist.sh ./examples/mnist/create_mnist.sh 

而後編輯examples/mnist文件夾下的lenet_solver.prototxt文件,將solver_mode模式從GPU改成CPU

./examples/mnist/train_lenet.sh

因爲是使用CPU進行訓練,因此速度會比較慢,大概三十分鐘才能整個訓練完

配置過程主要參考官方文檔:Ubuntu 14.04 VirtualBox VM · BVLC/caffe Wiki · GitHub

後面若是須要的話,還會繼續添加在Ubuntu14.04中的caffe配置,但目前這兩種已經夠用了

 

 


1.學習程序的第一步,先讓程序跑起來,看看結果,這樣就會有直觀的感覺。
Caffe的官網上 Caffe | Deep Learning Framework 提供了不少的examples,你能夠很容易地開始訓練一些已有的經典模型,如LeNet。我建議先從 LeNet MNIST Tutorial開始,由於數據集很小,網絡也很小但很經典,用不多的時間就能夠跑起來了。當你看到terminal刷拉拉的一行行輸出,看到不斷減小的loss和不斷上升的accuracy,訓練結束你獲得了99+%的準確率,感受好厲害的樣子。你能夠多跑跑幾個例子,熟悉一下環境和接口。

2.單步調試,跟着Caffe在網絡裏流動
當玩了幾天以後,你對Caffe的接口有點熟悉了,對已有的例子也玩膩了,你開始想看看具體是怎麼實現的了。我以爲最好的方法是經過單步調試的方式跟着程序一步一步的在網絡裏前向傳播,而後再被當成偏差信息傳回來。

Caffe就像一個你日常編程中Project,你可使用IDE或者GDB去調試它,這裏咱們不細說調試的過程。你能夠先跟蹤前向傳播的過程,無非就是從高層次到低層次的調用Forward函數, Solver->Net->Layer->Specific Layer (Convolution等...).後向傳播也相似,但由於你對Caffe裏面的各類變量運算不熟悉,當你跟蹤完前向傳播時可能已經頭暈眼花了,仍是休息一下,消化一下整個前向傳播的流程。

剛剛開始你沒有必要對每一個Layer的計算細節都那麼較真,大概知道程序的運算流程就好,這樣你才能夠比較快的對Caffe有個大致的把握。

3.個性化定製Caffe
到這裏,你已經能夠說本身有用過Caffe了,可是還不能算入門,由於你還不知道怎麼修改源碼,知足本身特定的需求。咱們不少時候都須要本身定義新的層來完成特定的運算,這時你須要在Caffe裏添加新的層。

你一開確定無從下手,腦子一片空白。幸運的是Caffe github上的Wiki Development · BVLC/caffe Wiki · GitHub已經有了教程了,並且這是最接近latest Caffe的源碼結構的教程,你在網上搜到的Blog不少是有點過期的,由於Caffe最近又重構了代碼。你能夠跟着它的指導去添加本身的層。

雖然你已經知道要在哪裏添加本身的東西了,但你遇到最核心的問題是如何寫下面這四個函數。
  • forward_cpu()
  • forward_gpu()
  • backward_cpu()
  • backward_gpu()
你能夠先模仿已有的層去實現這四個函數,並且我相信forward函數很快就能夠寫出來了,但backward的仍是一頭霧水。 這時咱們就要補補神經網絡裏最核心的內容了——Backpropagation.

4.理解並實現Backpropagation
這個我以爲是與平臺無關的,無論你是使用Caffe、Torch 7,仍是Theano,你都須要深入理解並掌握的。由於我比較笨,花了好長時間纔可以適應推導中的各類符號。其實也不難,就是偏差順着Chain rule法則流回到前面的層。我不打算本身推導後向傳播的過程,由於我知道我沒有辦法將它表達得很好,並且網上已經有不少很是好的教程了。下面是我以爲比較好的學習步驟吧。
  • 從淺層的神經網絡(所謂的全鏈接層)的後向傳播開始,由於這個比較簡單,並且如今咱們常說的CNN和LSTM的梯度計算也最終會迴歸到這裏。
    • 第一個必看的是Ng深刻淺出的Ufldl教程UFLDL Tutorial,還有中文版的,這對不喜歡看英語的同窗是個好消息。固然你看一遍不理解,再看一遍,忘了,再看,讀個幾遍你纔會對推導過程和數學符號熟悉。我頭腦不大行,來來回回看了好屢次。
    • 固然,Ufldl的教程有點短,我還發現了一個講得更細膩清晰的教程, Michael Nielsen寫的Neural networks and deep learning。它講得實在太好了,以致於把個人任督二脈打通了。在Ufldl的基礎上讀這個,你應該能夠很快掌握全鏈接層的反向傳播。
    • 最後在拿出standford大牛karpathy的一篇博客Hacker's guide to Neural Networks,這裏用了具體的編程例子手把手教你算梯度,並非推導後向傳播公式的,是關於通用梯度計算的。用心去體會一下。
  • 這時你躍躍欲試,回去查看Caffe源碼裏Convolution層的實現,但發現本身好像沒看懂。雖然說卷積層和全鏈接層的推導大同小異,但思惟上仍是有個gap的。我建議你先去看看Caffe如何實現卷積的,Caffe做者賈揚清大牛在知乎上的回答在 Caffe 中如何計算卷積?讓我茅塞頓開。重點理解im2col和col2im.
  • 這時你知道了Convolution的前向傳播,還差一點就能夠弄明白後向傳播怎麼實現了。我建議你死磕Caffe中Convolution層的計算過程,把每一步都搞清楚,通過痛苦的過程以後你會對反向傳播有了新的體會的。在這以後,你應該有能力添加本身的層了。再補充一個完整的添加新的層的教程Making a Caffe Layer • Computer Vision Enthusiast。這篇教程從頭開始實現了一個Angle To Sine Cosine Layer,包含了梯度推導,前向與後向傳播的CPU和GPU函數,很是棒的一個教程。
  • 最後,建議學習一下基本的GPU Cuda編程,雖然Caffe中已經把Cuda函數封裝起來了,用起來很方便,但有時仍是須要使用kernel函數等Cuda接口的函數。這裏有一個入門的視頻教程,講得挺不錯的NVIDIA CUDA初級教程視頻
 
 

本文只涉及Caffe結構的相關問題,不涉及具體實現技巧等細節。

==============================================================

1. 初識Caffe
1.1. Caffe相對與其餘DL框架的優勢和缺點:
優勢:
  • 速度快。Google Protocol Buffer數據標準爲Caffe提高了效率。
  • 學術論文采用此模型較多。不肯定是否是最多,但接觸到的很多論文都與Caffe有關(R-CNN,DSN,最近還有人用Caffe實現LSTM)
缺點:
  • 曾更新太重要函數接口。有人反映,偶爾會出現接口變換的狀況,本身好久前寫的代碼可能過了一段時間就不能和新版本很好地兼容了。(如今更新速度放緩,接口逐步趨於穩定,感謝 評論區王峯的建議)
  • 對於某些研究方向來講的人並不適合。這個須要對Caffe的結構有必定了解,(後面提到)。
1.2. Caffe代碼層次。
回答裏面有人說熟悉Blob,Layer,Net,Solver這樣的幾大類,我比較贊同。我基本是從這個順序開始學習的,這四個類複雜性從低到高,貫穿了整個Caffe。把他們分爲三個層次介紹。
  • Blob:是基礎的數據結構,是用來保存學習到的參數以及網絡傳輸過程當中產生數據的類。
  • Layer:是網絡的基本單元,由此派生出了各類層類。修改這部分的人主要是研究特徵表達方向的。
  • Net:是網絡的搭建,將Layer所派生出層類組合成網絡。Solver:是Net的求解,修改這部分人主要會是研究DL求解方向的。

==============================================================

2. Caffe進階
2.1. Blob:
Caffe支持CUDA,在數據級別上也作了一些優化,這部分最重要的是知道它主要是對protocol buffer所定義的數據結構的繼承,Caffe也所以能夠在儘量小的內存佔用下得到很高的效率。(追求性能的同時Caffe也犧牲了一些代碼可讀性)
在更高一級的Layer中Blob用下面的形式表示學習到的參數:
vector<shared_ptr<Blob<Dtype> > > blobs_; 
這裏使用的是一個Blob的容器是由於某些Layer包含多組學習參數,好比多個卷積核的卷積層。
以及Layer所傳遞的數據形式,後面還會涉及到這裏:
vector<Blob<Dtype>*> &bottom;
vector<Blob<Dtype>*> *top
2.2. Layer:
2.2.1. 5大Layer派生類型
Caffe十分強調網絡的層次性,也就是說卷積操做,非線性變換(ReLU等),Pooling,權值鏈接等所有都由某一種Layer來表示。具體來講分爲5大類Layer
  • NeuronLayer類 定義於neuron_layers.hpp中,其派生類主要是元素級別的運算(好比Dropout運算,激活函數ReLu,Sigmoid等),運算均爲同址計算(in-place computation,返回值覆蓋原值而佔用新的內存)。
  • LossLayer類 定義於loss_layers.hpp中,其派生類會產生loss,只有這些層可以產生loss
  • 數據層 定義於data_layer.hpp中,做爲網絡的最底層,主要實現數據格式的轉換。
  • 特徵表達層(我本身分的類)定義於vision_layers.hpp(爲何叫vision這個名字,我目前還不清楚),實現特徵表達功能,更具體地說包含卷積操做,Pooling操做,他們基本都會產生新的內存佔用(Pooling相對較小)。
  • 網絡鏈接層和激活函數(我本身分的類)定義於common_layers.hpp,Caffe提供了單個層與多個層的鏈接,並在這個頭文件中聲明。這裏還包括了經常使用的全鏈接層InnerProductLayer類。
2.2.2. Layer的重要成員函數
在Layer內部,數據主要有兩種傳遞方式, 正向傳導(Forward)反向傳導(Backward)。Forward和Backward有CPU和GPU(部分有)兩種實現。Caffe中全部的Layer都要用這兩種方法傳遞數據。
virtual void Forward(const vector<Blob<Dtype>*> &bottom, vector<Blob<Dtype>*> *top) = 0; virtual void Backward(const vector<Blob<Dtype>*> &top, const vector<bool> &propagate_down, vector<Blob<Dtype>*> *bottom) = 0; 
Layer類派生出來的層類經過這實現這兩個虛函數,產生了各式各樣功能的層類。Forward是從根據bottom計算top的過程,Backward則相反(根據top計算bottom)。注意這裏爲何用了一個包含Blob的容器(vector),對於大多數Layer來講輸入和輸出都各鏈接只有一個Layer,然而對於某些Layer存在一對多的狀況,好比LossLayer和某些鏈接層。在網路結構定義文件(*.proto)中每一層的參數bottom和top數目就決定了vector中元素數目。
layers { bottom: "decode1neuron" // 該層底下鏈接的第一個Layer bottom: "flatdata" // 該層底下鏈接的第二個Layer top: "l2_error" // 該層頂上鍊接的一個Layer name: "loss" // 該層的名字 type: EUCLIDEAN_LOSS // 該層的類型 loss_weight: 0 } 
2.2.3. Layer的重要成員變量
loss
vector<Dtype> loss_; 
每一層又有一個loss_值,只很少大多數Layer都是0,只有LossLayer纔可能產生非0的loss_。計算loss是會把全部層的loss_相加。
learnable parameters
vector<shared_ptr<Blob<Dtype> > > blobs_; 
前面提到過的,Layer學習到的參數。
2.3. Net:
Net用容器的形式將多個Layer有序地放在一塊兒,其自身實現的功能主要是對逐層Layer進行初始化,以及提供Update( )的接口(更新網絡參數),自己不能對參數進行有效地學習過程。
vector<shared_ptr<Layer<Dtype> > > layers_;
一樣Net也有它本身的
vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom, Dtype* loss = NULL); void Net<Dtype>::Backward(); 
他們是對整個網絡的前向和方向傳導,各調用一次就能夠計算出網絡的loss了。
2.4. Solver
這個類中包含一個Net的指針,主要是實現了訓練模型參數所採用的優化算法,它所派生的類就能夠對整個網絡進行訓練了。
shared_ptr<Net<Dtype> > net_;
不一樣的模型訓練方法經過重載函數ComputeUpdateValue( )實現計算update參數的核心功能
virtual void ComputeUpdateValue() = 0;
最後當進行整個網絡訓練過程(也就是你運行Caffe訓練某個模型)的時候,其實是在運行caffe.cpp中的train( )函數,而這個函數其實是實例化一個Solver對象,初始化後調用了Solver中的Solve( )方法。而這個Solve( )函數主要就是在迭代運行下面這兩個函數,就是剛纔介紹的哪幾個函數。
ComputeUpdateValue(); net_->Update(); 

==============================================================

至此,從底層到頂層對Caffe的主要結構都應該有了大體的概念。爲了集中重點介紹Caffe的代碼結構,文中略去了大量Caffe相關的實現細節和技巧,好比Layer和Net的參數如何初始化,proto文件的定義,基於cblas的卷積等操做的實現(cblas實現卷積這一點個人我的主頁 GanYuFei中的《Caffe學習筆記5-BLAS與boost::thread加速》有介紹)等等就不一一列舉了。

總體來看Layer部分代碼最多,也反映出Caffe比較重視豐富網絡單元的類型,然而因爲Caffe的代碼結構高度層次化,使得某些研究以及應用(好比研究相似非逐層鏈接的神經網絡這種複雜的網絡鏈接方式)難以在該平臺實現。這也就是一開始說的一個不足。

另外,Caffe基本數據單元都用Blob,使得數據在內存中的存儲變得十分高效,緊湊,從而提高了總體訓練能力,而同時帶來的問題是咱們看見的一些可讀性上的不便,好比forward的參數也是直接用Blob而不是設計一個新類以加強可讀性。因此說性能的提高是以可讀性爲代價的。
最後一點也是最重要的一點,我從Caffe學到了不少。第一次看的C++項目就看到這麼好的代碼,實在是受益不淺,在這裏也感謝做者賈揚清等人的貢獻。
 
 
 
相關文章
相關標籤/搜索