轉載請注明:http://blog.csdn.net/stdcoutzyx/article/details/39722999
在上一個鏈接中,我配置了 cuda ,有強大的 GPU ,自然不能暴殄天物,讓資源白白空暇著,所以配置一下卷積神經網絡跑一下程序嘍。至于卷積神經網絡的原理,容后再寫。打算先寫庫的使用方法,再寫原理,以行動帶動對理論的追求。
話不多說,步入正題。
1.?預說明
關于 cuda-convnet ,起源于一篇經典論文 ①,論文中針對 ILSVRC-2010 的數據進行實驗,然后發布了事實上驗使用的代碼,鏈接為 ②。可是,事實往往跟論文是有差距的,鏈接②中的代碼根本不能重現論文中的結果。在下不才,在使用這個鏈接的庫非常久之后才發現的,認為非常坑,希望后來者慎之。
之所以說它坑,首先,論文中提到特性中, multi-GPU 和 dropout 就沒有實現,并且也沒有給出論文中 8 層卷積神經網絡的配置文件。總之不能直接拿來用,須要自己探索。
盡管如此,但有總比沒有好,畢竟這個庫實現的卷積神經網絡封裝的非常好,論文中的大神的貢獻非我等小菜所能企及的。給大神點 32 個贊。
本文僅僅對 cuda-convnet 和 cuda-convnet2 的配置進行說明,論文中的作者還發布了其它版本號的庫,尚未用到,故且按下不提。
2.?Cuda-convnet 配置
2.1.?源代碼下載
參考鏈接②,先將源代碼下載下來。
      svn checkout http://cuda-convnet.googlecode.com/svn/trunk/ cuda-convnet-read-only
    
    
取出的版本號是 562 。
2.2.?安裝必要的庫
然后,安裝必須的庫,我使用的是 ubuntu 系統。所以命令為
      sudo apt-get install python-dev python-numpy python-magic python-matplotlib libatlas-base-dev
    
    
當然,還要確認你安裝了 cuda ,我安裝的是 cuda6.5 ,在 /usr/local/ 文件夾下,例如以下所看到的:
      $ ls /usr/local
bin  cuda  cuda-6.5  etc  games  include  lib  man  sbin  share  src
    
    
2.3.?更改 build.sh
進入到剛才下載的 cuda-convnet-read-only 文件夾,更改 build.sh 文件里的配置路徑。例如以下所看到的:
      # CUDA toolkit installation directory.
export CUDA_INSTALL_PATH=/usr/local/cuda
 
# CUDA SDK installation directory.
export CUDA_SDK_PATH=/usr/local/cuda-6.5/samples/common/inc
 
# Python include directory. This should contain the file Python.h, among others.
export PYTHON_INCLUDE_PATH=/usr/include/python2.7
 
# Numpy include directory. This should contain the file arrayobject.h, among others.
export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy
 
# ATLAS library directory. This should contain the file libcblas.so, among others.
export ATLAS_LIB_PATH=/usr/lib/atlas-base
 
make $*
    
    
      
依照官網的教程,配置完 build.sh 后就能夠進行編譯了。可是會錯誤發生,還須要改例如以下幾個地方才干夠。
2.4.?頭文件加入
直接編譯會發生找不到 cutil_inline.h 頭文件的錯誤。分析原因可能是原來有這個頭文件,后來這個頭文件的功能被實現到其它頭文件里去了。
在 include 子目錄下田間 cutil_inline.h 文件,并輸入內容。
      #include "helper_cuda.h"
#define cutilCheckMsg(a) getLastCudaError(a)
#define cutGetMaxGflopsDeviceId() gpuGetMaxGflopsDeviceId()
#define MIN(a,b) (a) < (b) ? (a) : (b)
    
    
2.5.?MakeFile 文件更改
MakeFile 第 3 行,原文例如以下:
      INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix
    
    
加入 cuda 的路徑后例如以下:
      INCLUDES :=  -I$(PYTHON_INCLUDE_PATH) -I$(NUMPY_INCLUDE_PATH) -I$(CUDA_SDK_PATH) -I./include -I./include/common -I./include/cudaconv2 -I./include/nvmatrix
    
    
保存之。
2.6.?最后的庫鏈接錯誤
做完上述修改后,能夠編譯了,但到最后會發生一個庫鏈接的錯誤,不用管,直接將那個庫凝視掉。
在 common-gcc-cuda-4.0.mk 文件的 332 行。直接用 # 號凝視。
      # LIB += -lcutil_$(LIB_ARCH) $(LIBSUFFIX) -lshrutil_$(LIB_ARCH) $(LIBSUFFIX)
    
    
至此,就能夠完畢 cuda-convnet 的編譯了。
3.?Cuda-convnet2 配置
顧名思義,這是 cuda-convnet 的 2.0 版本號,支持多 GPU 執行。
3.1.?源代碼下載
git?clone? https://code.google.com/p/cuda-convnet2/
3.2.?必要的庫
      sudo apt-get install python-dev python-numpy python-scipy python-magic python-matplotlib libatlas-base-dev libjpeg-dev libopencv-dev
    
    
3.3.?配置
我僅僅能說,這個版本號的比上個版本號人性化多了,這個版本號的 build.sh 直接如此。
      # CUDA toolkit installation directory.
export CUDA_INSTALL_PATH=/usr/local/cuda
 
# Python include directory. This should contain the file Python.h, among others.
export PYTHON_INCLUDE_PATH=/usr/include/python2.7
 
# Numpy include directory. This should contain the file arrayobject.h, among others.
export NUMPY_INCLUDE_PATH=/usr/lib/python2.7/dist-packages/numpy/core/include/numpy/
 
# ATLAS library directory. This should contain the file libcblas.so, among others.
export ATLAS_LIB_PATH=/usr/lib/atlas-base
 
# You don't have to change these:
export LD_LIBRARY_PATH=$CUDA_INSTALL_PATH/lib64:$LD_LIBRARY_PATH
export CUDA_SDK_PATH=$CUDA_INSTALL_PATH/samples
export PATH=$PATH:$CUDA_INSTALL_PATH/bin
    
    
假設是在 ubuntu 下的話,這樣就直接已經基本把路徑都配置對了。
3.4.?鏈接錯誤
可是直接編譯的話還是會遇到錯誤,例如以下所看到的:
      cd ./bin/ && g++  -O3   -DNUMPY_INTERFACE -shared -Wl,-no-undefined -o libutilpy.so src/matrix.o -L/usr/lib/atlas-base -latlas -lcblas -lpython2.7
/usr/bin/ld: cannot find -latlas
/usr/bin/ld: cannot find -lcblas
collect2: error: ld returned 1 exit status
    
    
主要是由于 atlas 庫中沒有 libatlas.so 和 libctlas.so 。查看 atlas 的文件夾發現結構如此:
      :/usr/lib/atlas-base$ ls -l
總用量 4292
drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas
lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0
-rw-r--r-- 1 root root 3746968  2月  4  2014 libatlas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0
-rw-r--r-- 1 root root  135376  2月  4  2014 libcblas.so.3.0
lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0
-rw-r--r-- 1 root root  131000  2月  4  2014 libf77blas.so.3.0
lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0
-rw-r--r-- 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0
    
    
加入兩個軟鏈接,運行命令:
      sudo ln -s libatlas.so.3.0 libatlas.so
sudo ln -s libcblas.so.3.0 libcblas.so
    
    
文件夾結構變為如此:
      /usr/lib/atlas-base$ ls -l
總用量 4292
drwxr-xr-x 2 root root    4096  9月 22 11:41 atlas
lrwxrwxrwx 1 root root      15 10月  1 22:35 libatlas.so -> libatlas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libatlas.so.3 -> libatlas.so.3.0
-rw-r--r-- 1 root root 3746968  2月  4  2014 libatlas.so.3.0
lrwxrwxrwx 1 root root      15 10月  1 22:36 libcblas.so -> libcblas.so.3.0
lrwxrwxrwx 1 root root      15  2月  4  2014 libcblas.so.3 -> libcblas.so.3.0
-rw-r--r-- 1 root root  135376  2月  4  2014 libcblas.so.3.0
lrwxrwxrwx 1 root root      17  2月  4  2014 libf77blas.so.3 -> libf77blas.so.3.0
-rw-r--r-- 1 root root  131000  2月  4  2014 libf77blas.so.3.0
lrwxrwxrwx 1 root root      22  2月  4  2014 liblapack_atlas.so.3 -> liblapack_atlas.so.3.0
-rw-r--r-- 1 root root  369472  2月  4  2014 liblapack_atlas.so.3.0
    
    
然后就能夠正常編譯了。
參考文獻
① ImageNet?Classification?with?Deep?Convolutional?Neural?Networks
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
 
					微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
 
					

