深度网络的设计与可视化工具
深度網(wǎng)絡(luò)的設(shè)計與可視化工具
caffe
Linux環(huán)境的準(zhǔn)備
主要是根據(jù)?caffe install manual?來進(jìn)行的。主要庫的依賴可以用這個https://github.com/gwli/StudyNote/blob/master/caffe/install/prepare.py?來完成安裝。
nvidia driver 的安裝
從?官網(wǎng)?下載最新driver,
進(jìn)入字符介面 tty1
ctl+alt+F1
關(guān)掉 X windows.
sudo service lightdm stop
安裝driver.
chmod +x installer.run;./installer.run
恢復(fù) X windows.
sudo service lightdm start
Note
正常的情況下installer會自動disable的自帶的driver,如果失敗的重起一下,重新執(zhí)行installer就行了。
安裝cuda-toolkit
這里從兩種方式來安裝,手動安裝,或者使用?jetpack pro?只安裝 host端的cuda-toolkit.
添加源
$ dpkg -i cuda-repo-ubuntu1404_6.5_amd64.deb安裝 cuda toolkit
$ sudo apt-get install -y cuda-toolkit-6-5配置環(huán)境變量
$ export PATH+=:/usr/local/cuda-6.5/bin/:$ LD_LIBRARY_PATH+= /usr/local/cuda-6.5/bin/lib:$ export LD_LIBRARY_PATH.. note::也可以直接寫.bashrc中就行,重啟shell就行了。相關(guān)庫的安裝
直接使用?https://github.com/gwli/StudyNote/blob/master/caffe/install/prepare.py?來完成就行了。
下面幾個不常見庫的說明
| google-glog | google提供的一個C++的logging庫 | https://code.google.com/p/googl有e-glog/ |
| protobuf-devel | 性能更好的jason用于進(jìn)程通信 | 相當(dāng)于TCP/IP的包解析技術(shù)用在了進(jìn)程通信IPC. |
| gflags | 類似于getopt命令行處理接口 | http://dreamrunner.org/blog/2014/03/09/gflags-jian-ming-shi-yong/ |
| google snappy | 一個高速的壓縮庫,http://www.infoq.com/cn/news/2011/04/Snappy | ? |
| google leveldb | LevelDB is a fast key-value storage library written at Google that provides an ordered mapping from string keys to string values.,https://github.com/google/leveldb | ? |
安裝cudnn
從 ·https://developer.nvidia.com/cuDNN?下載 linux 官
解壓安裝
$ tar -xzvf cudnn.tgz $ mv cudnn /usr/local/cudnn修改LD_LIBRARY_PATH
LD_LIBRARY_PATH+=:/usr/local/cudnn:C_INCLUDE_PATH+=:/usr/local/cudnn:CPLUS_INCLUDE_PATH+=:/usr/local/cudnn:PATH+=:/usr/local/cuda-6.5/bin:LD_LIBRARY_PATH+=:/usr/local/cuda-6.5/lib64:LD_LIBRARY_PATH+=:/usr/local/cuda/cudnn:export LD_LIBRARY_PATHC_INCLUDE_PATH+=:/usr/local/cuda/cudnn:CPLUS_INCLUDE_PATH+=:/usr/local/cuda/cudnn:由于采用 cudnn 的庫與caffe兼容性問題,現(xiàn)在 caffe 與V1 是工作的。一個快速靈活的辦法,那就是link... code-block:: bashln -s /usr/local/cudnn-6.5-linux-x64-v2-rc2/ /usr/local/cuda/cudnnbuild
caffe 采用了大量的template,所以代碼模式基本
build the app
make all |tee make.log
build the test
make test |tee test.log
run the test
make runtest |tee runtest.log
Note
cudnn-6.5-linux-R2-RC1 is compatible with caffe, cudnn-6.5-linux-R1 is good. 可以在這個https://groups.google.com/forum/#!forum/caffe-users 里找到這個問題
support python
安裝依賴
cd $caffe_root/python for req in $(cat requirements.txt);do pip install $req; doneinstalll scipy
there is miss requirment scipy this need fortrain compiler you can install it by
最簡單的辦法
apt-get install python-scipy
添加caffe to python lib
export PYTHONPATH=/$caffe_root/python:$PYTHONPATH生成文檔
install jekyll
apt-get install jekyll doxygen texlive-full
深度學(xué)習(xí)
深度學(xué)習(xí)與前些年神經(jīng)網(wǎng)絡(luò)的區(qū)別,那就是網(wǎng)絡(luò)層數(shù)要比以前多了。這樣的話功能就大大加強(qiáng)了。
網(wǎng)絡(luò)一組layer來組成,layer 又由一組node來組成,層與層之間聯(lián)接是由forword與backwrod連接組成。每一層都solver,以及module. 而這里blobs 就是node. foward 用來把input -> output同時計算出 loss cost,而backword 而是根據(jù)loss cost來計算梯度來提取下一步w,b,優(yōu)化到什么程度為止呢,取決于error 要求和iter numbers.
每一個小的神經(jīng)網(wǎng)絡(luò)連接再加上形成大的神經(jīng)網(wǎng)絡(luò),就實(shí)現(xiàn)了腦的功能。
Blobs 是由包著數(shù)據(jù)本身(什么意思?),而數(shù)據(jù)本身四維的數(shù)組(Num,Channels,Height and Width) 有點(diǎn)類似于CUDA的Thread分配。Blobs更像是CUDA Array 的機(jī)制。Blobs統(tǒng)一管理CPU與GPU的內(nèi)存。(n,k,h,w)正好每個線程計算輸入都是由Blobs來的。輸入傳輸,利用google proto來進(jìn)傳輸。?Google Protocol Buffer 的使用和原理?google 這種機(jī)制就其名字一樣,(把什么當(dāng)作?)當(dāng)作協(xié)議包來解析,就像網(wǎng)絡(luò)包一樣,每一個包不需要通用,只要自己能認(rèn)識自己就行了。就像網(wǎng)絡(luò)協(xié)議一樣,只規(guī)定了協(xié)議包結(jié)構(gòu)。就自然解析就容易了。無非兩種TLV,并且進(jìn)一步利用編碼本身實(shí)現(xiàn)壓縮,并且元編程實(shí)現(xiàn)類的自動化定義與實(shí)現(xiàn)。并且還支持動態(tài)編譯JIT,這也就意味著沒有只要有源碼就行了。
同時Blobs,保存兩種數(shù)據(jù),一種是Data,一種是diff,簡單的說Data是往前傳,而diff計算梯度是往后傳。
這個是把編碼與元編程技術(shù)結(jié)合起來的。
caffe 這個神經(jīng)網(wǎng)絡(luò)還可以snapshotting與resume,這個就非常的方便。
深度網(wǎng)絡(luò)
本質(zhì)是一層一層向上抽象的過程。同時一個由無序到有序的過程。但是過程的路徑又不指一條,就像人每個人的思維過程也是一樣的。所以每一層的每個神經(jīng)網(wǎng)絡(luò)的抽象可以不同。并且再加上一順序就會有各種各樣的結(jié)果。到這個過程中就像需要有一個像分詞庫一樣的東東。如果只是簡單組合就能得到一屬性,還是排列才能進(jìn)行判定, 排列與組合是不同層次的判別路線。
深學(xué)習(xí)就是在解決如抽象概念這個難題。
caffe流程
caffe的設(shè)計原則與自己的原則一樣的,分層的模塊化的設(shè)計。把一個大大的問題不斷的breakdown,變成幾個已經(jīng)解決的小問題。 #. 數(shù)據(jù)格式的轉(zhuǎn)換,目前支持 lmdb,leveldb. #. 定義 network
開發(fā)流程添加幾個頭文件與與源文件。然后實(shí)現(xiàn)setup,initial, resharp,forward,backword,然后就注冊就行了。
數(shù)據(jù)的準(zhǔn)備
在網(wǎng)絡(luò) 里主要有?data_para?與?transform_para?.
而預(yù)處理包括,通過指定 TransformationParameterS.
數(shù)據(jù)格式
key,value格式,leveldb,lmdm等等就是這種。
hdf5?用來層次化的數(shù)據(jù)格式,相當(dāng)于面向?qū)ο蠼Y(jié)構(gòu)串行化。 如果其看成是例如IP的解析則更容易理解,例如Mongo那種理解,就相當(dāng)于TLV格式的包結(jié)構(gòu)。 Hierarchical Data formathttp://en.wikipedia.org/wiki/Hierarchical_Data_Format.
深度學(xué)習(xí)和并行計算
早期的神經(jīng)網(wǎng)絡(luò),因無法處理兩層以上的網(wǎng)絡(luò),都是淺層的。目前的深度學(xué)習(xí),因采取逐層預(yù)訓(xùn)練和全局微調(diào)策略,能夠?qū)崿F(xiàn)深層次的網(wǎng)絡(luò)結(jié)構(gòu)(目前通常需要10層以上的隱含層,才能夠取得較好的建模效果),但實(shí)際上訓(xùn)練一層的神經(jīng)網(wǎng)絡(luò)是非常困難的。這是因?yàn)楫?dāng)前的深度學(xué)習(xí)網(wǎng)絡(luò)中存在上百萬、甚至是上千萬的參數(shù)需要經(jīng)過后向反饋來調(diào)整,并且深度學(xué)習(xí)需要大量的訓(xùn)練數(shù)據(jù)來確保分類和預(yù)測的準(zhǔn)確性,也就意味著幾百萬甚至是幾千萬的輸入數(shù)據(jù)需要運(yùn)行在前向或者后向反饋中,因此計算量是非常巨大的。另一方面,深度學(xué)習(xí)由大量相同的、并行的神經(jīng)元組成,能夠并行映射到GPU中,能夠提供巨大的計算加速。這里使用NVIDIA公司提供的深度學(xué)習(xí)平臺:CAFFE。 實(shí)驗(yàn)已表明,當(dāng)訓(xùn)練“reference imagenet”時, 并行計算能夠獲得10倍于intel ivyBridge CPU的加速。
NVIDIA cuDNN 是主要的深度學(xué)習(xí)GPU加速庫,它提供深度學(xué)習(xí)中常用的操作。比如:卷積、池化、softmax、神經(jīng)元激活(包括sigmoid、矯正線性器和Hyperbolic tangent ),當(dāng)然這些函數(shù)都支持前向、后向傳播,cuDNN主要是在以矩陣相乘的方面擅長,cuDNN特性定數(shù)據(jù)輸出,支持可伸縮的維度定制, dimension ordering, striding and subregions for 對于四維張量。這些可伸縮性允許神經(jīng)元積分,并且能夠避免輸入輸出轉(zhuǎn)換。
cuDNN是線程安全的,提供基于內(nèi)容的APi,從而能夠支持多線程和共用CUDA線程。使得開發(fā)者能夠精確地使用多主線程和多GPU,控制庫。確保GPU設(shè)備總是在一個特殊的主線程中使用。
cuDNN允許深度學(xué)習(xí)開發(fā)者能夠掌握當(dāng)前的狀態(tài)并且能夠把精力集中在應(yīng)用和機(jī)器學(xué)習(xí)問題上,而不需要寫額外的定制代碼。cuDNN能夠 在Windows和LInux OSes平臺上。支持所有的NVIDIA GPU,從低端的GPU,比如Tegra k1 到高端的 Tesla K40. 當(dāng)開發(fā)者使用cuDNN,能夠確保得到目前的和未來的高性能,并且得益于GPU特性。
cuDNN是為了深度學(xué)習(xí)開發(fā)者,它非常易用,使得開發(fā)者無需知道CUDA。在CAFFE,深度學(xué)習(xí)使用基于本文的配置文件。使用CAFFE,使用定義神經(jīng)網(wǎng)絡(luò)的每一層,制定層的類型(包括數(shù)據(jù)、卷積和全連接)并且層提供他的輸入。并且有類似的配置文件,定義怎樣初始化神經(jīng)網(wǎng)絡(luò)參數(shù)以及訓(xùn)練的重復(fù)次數(shù)等等。
cudnn
cuda的deeplearning 庫
流程本身與CUDA是一樣的,數(shù)據(jù)格式可以改變access pattern可以盡可能利用cache來提高效率。 kernel本身計算模式的改變可以盡可能利用硬件資源。一個算法本身計算量可以大大的減少。 通過thread,L1,L2,register等等,以及 stream, cdn,cnp資源的分配來提高硬件的occupancy.
目前為止,這是CUDA執(zhí)行模式。各種庫無非就在些基礎(chǔ)上來進(jìn)行進(jìn)一步限定。
或者添加些help函數(shù)來實(shí)現(xiàn)實(shí)現(xiàn)自動的thread分配。并且把一些算法的kernel來實(shí)現(xiàn)一下, 并且更加上一些元編程把kernel的實(shí)現(xiàn)做一些自動的適配與優(yōu)化。thrust都是這樣干的。
checkCUDNN( cudnnConvolutionForward(cudnnHandle,&alpha,srcTensorDesc,srcData,filterDesc,conv.data_d,convDesc,algo,workSpace,sizeInBytes,&beta,dstTensorDesc,*dstData) );其余那就類似于 CUDA runtimeapi 一樣,各種各樣的get/set以及createhandle之類的東東了。
Theano
- install note
theano利用python的語法來實(shí)現(xiàn)了自己的語言。這個語言的特別之處,自己實(shí)現(xiàn)的用自己的,自己沒有實(shí)現(xiàn)的就可以直接使用了python的,不過只是一個中間件語言,下層實(shí)現(xiàn)還是直接借用CPU與GPU的blas庫。并且theano實(shí)現(xiàn)還是一個JIT編譯器。它的主要特點(diǎn)那就是直接使用利用sympy以及自己的張量符號表達(dá)式來直接構(gòu)造公式,在theano中公式與函數(shù)基本上可以直接化等號了。 并且theano還有自己的編譯算法,它可以直接打印出依賴圖,如何簡化自己的邏輯圖呢。
既然是語言,就要變量,循環(huán),分支,函數(shù)。那theano中是如何實(shí)現(xiàn)這些的。
變量?類型兩部分,基本類型本身另外那就是結(jié)構(gòu),例如tensor.dscalar,就是double類型的標(biāo)量
| b | w | i | l | f | d | c | byte | word | int | long int | float | double | compex | ? |
| scalar | vector | matrix | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
循環(huán),又分為map/reduce兩種。而在theano中采用了scan 來描述。這樣是為了能夠讓theano識別for,只是其返回值,其中update是要function來用,另外是做計算結(jié)果來使用的。
分支 對于計算模型循環(huán)要遠(yuǎn)遠(yuǎn)大于分支,并且在大量的matrix不存在分支模型。所以在計算型的語言中分支會用的比較少,例如CG編程中主要是計算。
函數(shù)?直接用表達(dá)式來構(gòu)造函數(shù),但是沒有看到其作用域的使用,沒有直接聲明函數(shù)的{}范圍,其實(shí)直接使用引用傳遞,與可以實(shí)現(xiàn) 多值反回,就可以實(shí)現(xiàn)n對n的輸出。正常的函數(shù)輸出是n對1,n對n的輸出,那就可以引用傳遞。在python 可以使用global來實(shí)現(xiàn)。 theano中函數(shù)聲明沒有傳統(tǒng)語言的方式,直接符號表達(dá)式使用來當(dāng)做函數(shù)體。當(dāng)然這個過程它也會做一些符號計算。幫你做公式推導(dǎo)。
theano.function這個是編譯指令,然后返回一個編譯后object,就像shaderobject. 函數(shù)輸入,解決了python中沒有引用傳遞的問題,如果你把變量聲明成shared類型,那就是引用傳遞了。也可以用borrow 的屬性來直接使用引用傳遞。但保存一些python中好的習(xí)慣,參數(shù)可以有默認(rèn)的值。格式Param(y,default=1)格式,也可以name/value來賦值。 函數(shù)體的可以直接使用輸出表達(dá)式,也可以用update,given來指定。update 是用來指定如何操作shared變量,而givens,用來變量替換的。 theano這種方式可以復(fù)用達(dá)到每一條指令的顆粒度,即因?yàn)樵跊]有編譯之前都是符號表達(dá)式。
函數(shù)輸出可以是多值輸出,這可以任意的中間狀態(tài)輸出。
+theano 結(jié)構(gòu)
現(xiàn)在明白了theano中對于優(yōu)化問題的固定的結(jié)構(gòu),首先declare the variable, then compile the data ,input, outputs, then tain the data; finally look at the results.
declare variable->construct the expression graph-> compile->train->show the results
+theano graph
在調(diào)試的時候,我們必須知道什么是graph,包產(chǎn)variable,op等,首先輸出的操作數(shù),y.owner.op.name 對于函數(shù)輸出y.maker.fgraph.outputs,一個函數(shù)形式,y.maker.fgraph.inputs是[x, w, b],輸入tensorvariable。
好像整個都是以函數(shù)的輸出就是函數(shù) theano.function{outputs} 中輸出的類型就是function,無法得到實(shí)際數(shù)據(jù)。
多次迭代共同改變的是w的值。調(diào)節(jié)的是x,y 不斷的輸入,現(xiàn)在明白了為什么w,b是全局變量。
這里的prediction 好像沒有什么用,只是預(yù)測。
- Matlab vs. scipy & numpy
math compiler?公式編譯器,原理你把公式寫出來,編譯器就會把公式化簡然后轉(zhuǎn)化為高性能代碼來進(jìn)行計算。因?yàn)楦鱾€平臺都會有各自己的高性能計算庫,例如blas,lapack,intel的mkl,還有nv的cuda等等都是有現(xiàn)成了運(yùn)算庫,然后我們需要把算法以及矩陣運(yùn)算,然后把分塊分工,然后分配給這些計算單元并行??磥砭幾g語法分析是重點(diǎn)。自己一定要自己實(shí)現(xiàn)一個解析器。
– Main.GangweiLi - 22 Jan 2014
張量計算?這個是theano這個庫所主要實(shí)現(xiàn)的功能,這個是sympy所沒有實(shí)現(xiàn)的功能。另外的那就是公式編譯器。其通過實(shí)現(xiàn)一個圖,采用利用圖論的最短路徑來進(jìn)行化簡。
– Main.GangweiLi - 26 Jan 2014
theano利用自己的內(nèi)存分配機(jī)制,例如share型,一個獨(dú)立的類型,就像語言一樣有register型,對于異構(gòu)編程的時候,會有對應(yīng)的內(nèi)存,例如CPU內(nèi)存,GPU內(nèi)存,還有共享區(qū)域。
– Main.GangweiLi - 26 Jan 2014
我是不是要實(shí)現(xiàn)一門自己的語言,然后把它轉(zhuǎn)化成各種語言,以后我只寫我自己的語言,然后再進(jìn)行轉(zhuǎn)換。
– Main.GangweiLi - 26 Jan 2014
NVCC?這個封裝與python自身的那個 destutil 差不多,自己封裝一個toolchain for NVCC, 當(dāng)然要寫配置文件,分析配置文件直接使用的是python 的configparser 庫,看來自己以后可以直接這個了。
– Main.GangweiLi - 07 Mar 2014
優(yōu)化?對于不認(rèn)識的新op是不會進(jìn)行優(yōu)化的。
– Main.GangweiLi - 07 Mar 2014
from:?http://deeplearningongpu.readthedocs.org/en/latest/Stage_3.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的深度网络的设计与可视化工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度网络的框架结构
- 下一篇: 多分类问题中混淆矩阵(Confusion