【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具
唉。好不容易折騰完畢caffe,突然發現caffe比較適合搭建卷積神經網絡,而對于DBN和LSTM的搭建好像比較麻煩,相關教程沒有找到,手頭上又有一個theano的代碼想調試看看,所以入坑了。
準備工具:
VS2013:鏈接:http://pan.baidu.com/s/1coNs7c 密碼:r2s4
Anaconda2-4.0.0:鏈接:http://pan.baidu.com/s/1o7Nu4Qm 密碼:qiil
關于anaconda可以到官網下載:https://www.continuum.io/downloads#_windows
【注】本教程只是瞎折騰最新版的theano 0.9,目前網上的教程基本都是theano 0.82版本的配置方法好像
第一步
安裝anaconda
【PS】盡量使用3.5版本一下的,因為我注意要PTVS竟然不支持python3.5,如果你使用pycharm的話,可以自己嘗試一下python3.x的配置
雙擊安裝
第二步
win+r輸入cmd命令,打開命令窗口,輸入
pip install theano可能你們運行的和我不一樣,因為我已經安裝過了,如果為安裝過的話,這個界面會彈出一堆橫條條附帶百分號,顯示安裝了多少
下面那個python -m pip install --upgrade pip 是更新命令,敲上去再說。。。。。。。
歸結起來步驟就是:下載anaconda->安裝之->cmd安裝theano->pip命令的更新(這個隨便)
第三步
配置一下python的環境變量,這個anaconda安裝完畢以后好像會有python.exe,只需要把這個環境變量加進去就行啦(記得與后面的環境變量用英文分號隔開)
測試一下python是否安裝成功
cmd輸入python就行了
但是當我們輸入import theano.tensor as T的時候提示g++未檢測到,這個時候使用anaconda下載一個mingw,(不要輕易自己去下載mingw安裝,可能會遇到坑)
直接cmd里面輸入
conda install mingw libpython下載完畢以后添加環境變量:
path中添加:C:\Anaconda2\MinGW\bin;C:\Anaconda2\MinGW\x86_64-w64-mingw32\lib;【根據你自己的路徑定哦】
新建一個PYTHONPATH:C:\Anaconda2\Lib\site-packages\theano;【同樣根據自己的路徑添加】
好了,測試一下怎么樣:
看到這里就放心了,成功~~~
第四步
【注】使用pycharm的童鞋可以跳過此步驟,反正都是python的IDE嘛,沒啥區別。
VS安裝PTVS,這個可以在https://pytools.codeplex.com/這里找到,相關視頻教程在https://www.youtube.com/watch?v=JNNAOypc6Ek,我記得需要下載兩個東西, 這個就不解釋了
傻瓜式安裝就是,直接文件->新建->python,然后他會提示缺少什么,而且相關安裝信息也會給你,就點它安裝就行,視頻教程很清楚,只看前三分鐘就行,后面介紹的是PTVS的特性。
第五步
更新VS的環境變量
第六步
測試一下theano是否安裝成功
在此處能找到測試代碼:http://deeplearning.net/software/theano/install_windows.html#installation-of-theano-on-windows
我貼出來我的測試代碼:
import numpy as np import time import theano A=np.random.rand(1000,10000).astype(theano.config.floatX) B=np.random.rand(10000,1000).astype(theano.config.floatX) np_start=time.time() AB=A.dot(B) np_end=time.time() X,Y=theano.tensor.matrices('XY') mf=theano.function([X,Y],X.dot(Y)) t_start=time.time() tAB=mf(A,B) t_end=time.time() print("NP time %f[s],theano time :%f(s)(times should be close when run on CPU!)"%(np_end-np_start,t_end-t_start)) print("Result difference:%f "%(np.abs(AB-tAB).max(), ))我的測試結果第七步
【廢話】網上有很多theano 0.8.2的配置方法,雖然可以運行出結果,但是我跑代碼的時候就是出錯,無奈啊,瞎折騰了許久,最后瞎配了,也不知道成功了沒,但是運行我目前的代碼是達到了CPU一樣的效果,之前按照網上配置的theano 0.8.2,雖然測試沒問題,也能算東西,但是就是結果明顯不對,尷尬,說了堆廢話。
前提條件:安裝CUDA8.0+CUDNN5.1的方法看我前面caffe的gpu安裝方法就行啦,最好是找個方法自己測試一下你的cuda和cudnn是否正確安裝,因為我的GPU版caffe能跑起來,說明環境一起準備妥當,如果后續出現問題,肯定可以排除CUDA和cudnn安裝錯誤這個選項。
因為前面使用pip安裝過CPU版本的theano,我也不知道這個會不會影響conda安裝同樣的東西,不過保險起見,卸載之,win10管理員powershell,運行
pip uninstall theano接下來的方法很簡單:
首先,其實也就是比網上theano 0.8.2的配置方法多出來的一步驟
conda install theano pygpu然后找到依據cmd運行所提示的home目錄,一般都是類似于C:\Users\Administrator這個文件夾(慢慢找,學計算機的基本都知道這個文件夾,非計算機的沒找到建議尋求計算機專業學生幫助)。在此文件夾下添加空白的.theanorc.txt文檔,然后添加以下內容:
[global] openmp = False device = gpu floatX = float32 allow_input_downcast=True[blas] ldflags =[gcc] cxxflags = -IC:\ProgramData\Anaconda2\MinGW\x86_64-w64-mingw32\include[nvcc] flags = -LC:\ProgramData\Anaconda2\libs compiler_bindir = C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin fastmath = True[cuda] root=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0[dnn] include_path=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include library_path=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\lib\x64[lib] cnmem=0.8路徑自己對著改改。
第八步
為了保險,進行了兩次測試。
使用cmd中的python命令行測試如下代碼:
新建一個test.py
from theano import function, config, shared, sandbox import theano.tensor as T import numpy import timevlen = 10 * 30 * 768 # 10 x #cores x # threads per core iters = 1000rng = numpy.random.RandomState(22) x = shared(numpy.asarray(rng.rand(vlen), config.floatX)) f = function([], T.exp(x)) print (f.maker.fgraph.toposort()) t0 = time.time() for i in range(iters):r = f() t1 = time.time() print ('Looping %d times took' % iters, t1 - t0, 'seconds') print ('Result is', r) if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):print ('Used the cpu') else:print ('Used the gpu')運行結果: PS E:\code_test\theano> python .\test.py WARNING (theano.sandbox.cuda): The cuda backend is deprecated and will be removed in the next release (v0.10). Please switch to the gpuarray backend. You can get more information about how to switch at this URL:https://github.com/Theano/Theano/wiki/Converting-to-the-new-gpu-back-end%28gpuarray%29Using gpu device 0: GeForce GTX 1060 6GB (CNMeM is disabled, cuDNN 5005) [GpuElemwise{exp,no_inplace}(<CudaNdarrayType(float32, vector)>), HostFromGpu(GpuElemwise{exp,no_inplace}.0)] ('Looping 1000 times took', 0.32000017166137695, 'seconds') ('Result is', array([ 1.23178029, 1.61879349, 1.52278066, ..., 2.20771813,2.29967761, 1.62323296], dtype=float32)) Used the gpu
---------------------可愛的分割線----------------------------------
使用jupyter notebook測試另一個關于圖像的代碼:
import theano import numpy import pylab from theano import tensor as T from theano.tensor.nnet import conv from PIL import Image # 生成一個隨機數生成類rng,其seed為23455(隨機數種子)。 rng = numpy.random.RandomState(23455) # 實例化一個4D的輸入tensor,是一個象征性的輸入,相當于形參,需要調用時傳入一個實參 input = T.tensor4(name='input') # 權值數組的shape(可以理解為權值的數組大小),用來確定需要產生的隨機數個數, #(該大小可以理解為是一個 2行3列 的矩陣,其中每個矩陣元素又是一個 9行9列的 矩陣) w_shp = (2, 3, 9, 9) # 每個權值的邊界,用來確定需要產生的每個隨機數的范圍。 w_bound = numpy.sqrt(3 * 9 * 9) # rng.uniform(low,hign,size)的作用是產生一個shape為size的均勻分布數組,每個數的范圍為(low,high) # numpy.asarray(a)的作用是將 類數組a 轉化為array類型 # theano.shared()實例化一個權值變量(只是為了進行GPU加速時用),可以調用W.get_value()查看其value W = theano.shared( numpy.asarray( rng.uniform( low=-1.0 / w_bound, high=1.0 / w_bound, size=w_shp), dtype=input.dtype), name ='W') # 下面是用同樣的方法初始化一個偏置值b,b通常被初始化為0,因為它在算法中會有一個被學習的過程; # 但是此處是需要直接用它來計算,所以用隨機值給它初始化,就當做是已經經過學習后的值了。 b_shp = (2,) b = theano.shared(numpy.asarray( rng.uniform(low=-.5, high=.5, size=b_shp), dtype=input.dtype), name ='b') # conv.conv2d(input,filter) 需要2個輸入,一個是input,一個是filter。 # input就是上文中的4D張量,每個張量分別代表[mini-batch size,特征圖的數量,圖像高度,圖像寬度]。 # filter就是上文中的W。也是一個4D張量,分別代表[m層特征圖數量,m-1層特征圖數量,過濾器高度,過濾器寬度]。 # # 當其他函數需要用到變量conv_out時,會先把實參input傳入conv2d()中,再計算出conv_out # conv_out = conv.conv2d(input, W) # dimshuffle是一個很強大的能輕松改變一個張量結構的工具。b.dimshuffle('x', 0, 'x', 'x') # 就是把b的原始的第0列向量的左側添加一個維度,在其右側添加兩個維度。 # b原來是個一維數據(2),經過dimshuffle之后,則變成了一個四維數據(1*2*1*1)。 # dimshuffle具體的操作,參見文章一開始。 output = T.nnet.sigmoid(conv_out + b.dimshuffle('x', 0, 'x', 'x')) # 創建一個用來過濾圖像的theano.function(可以把f編譯為c,然后就可以隨時拿來用了。) # # 當其他函數需要調用f時(調用形式為f(input)),需要傳入實參input,然后將計算結果存入output中。 # f = theano.function([input], output) # 下面開始處理幾幅圖片來看一下效果 # 打開一幅圖片,源代碼中有2個"open",應該是在linux中的語法,我是在windows上運行的,所以改成1個open img = Image.open('F:\\Photo\\1.jpg')# 得到圖片的寬度和高度(注意,順序一定不要弄反) img_w, img_h = img.size # 將圖片像素按照(高度,寬度,通道數量)格式化為array數組 # 其實就是將圖片數據格式化為一個數組,因為每個像素點包括3個字節,B,G,R,且其范圍為0-255, # 這個地方最后將其除以256是為了歸一化,歸一化后的數據是float64類型 img = numpy.asarray(img, dtype='float32') / 256. # 圖片的原始數據是一個3D數據【高,寬,通道數量】, # 經過數據置換(transpose(2,0,1))之后,變成了【通道數量,高,寬】, # 因為f中傳入參數需要4D,因此需要將圖片數據reshape成為一個【1, 通道數量, 高, 寬】這樣的4D張量, # reshape的參數一定要注意,1就是最外的那一維度,3就是通道數量,然后是【高】和【寬】, # 這樣結果的 img_.shape =【1, 3, 寬, 高】 # # 為什么reshape為這樣的size呢?因為調用f時需要傳入一個input,而這個input就是4D,最終的這個input是傳入到 # conv2d中的第一個參數,而那個參數的格式是什么呢?[mini-batch size,特征圖的數量,圖像高度,圖像寬度] # 這樣就串起來了吧,第一個參數是batch size,據我所知應該是指卷積核的數量吧,但是不知道為什么這里是1? # 第二個參數代表輸入層的特征圖數量,這個地方是3,其實就是把一張彩色圖片按照3個通道作為3個特征圖進行輸入; # 最后兩個是圖像的高度和寬度,正好一一對應。 # img_ = img.transpose(2, 0, 1).reshape(1, 3, img_h, img_w) # 將img_作為f的參數,經過計算得到輸出 filtered_img = f(img_) # 將原始圖片顯示出來 pylab.subplot(1, 3, 1); pylab.axis('off'); pylab.imshow(img) # 圖片灰度化 pylab.gray(); # 分別顯示不同處理后的圖片 pylab.subplot(1, 3, 2); pylab.axis('off'); pylab.imshow(filtered_img[0, 0, :, :]) pylab.subplot(1, 3, 3); pylab.axis('off'); pylab.imshow(filtered_img[0, 1, :, :]) pylab.show() 結果【注】第二個測試代碼一定要測試,因為我當時配置theano 0.8.2的GPU模式以后,死活運行不了這第二個代碼,第一個代碼的結果倒是和網上說的一模一樣。
總結
以上是生活随笔為你收集整理的【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spectral hashing--谱哈
- 下一篇: 交行bilibili主题信用卡值得办吗?