深度学习anaconda+theano使用框架配置

本文主要讲解如何在windows平台配置python深度学习框架,花了3-4天才完全配置好了python+theano,一定得好好地写一下。

关于python的强大,我就不说了,自己体会吧,我也正在体会中。首先极力推荐使用它anaconda,anaconda内置地包含了numpy等各种各样科学计算所需要的开源库,省掉了很多时间去独自配置这些东西。好吧,废话不多说了,现在开始。

第一步 下载anaconda

在这里请注意,先看好你的电脑室32的还是64的,请下对应的版本。我的是win7 64位的所以下载的就是


这里需要说一下,我刚开始下载的是PYTHON3.5的版本,这两个版本都是不包含mingw和libpython包的,需要自己进行安装,但是后来悲剧了,3.5版本死活安装不了libpython,提示libpython与PYTHON3.5有冲突,没办法安装,我查了好长时间,也没有解决,这点还要靠大家自己去查,看看是什么情况。所以最后我没办法了,就重新下载了PYTHON2.7版本的进行安装配置,居然成功了。所以这里极力推荐大家下载2.7版本的,也就是上图画红色圈的那个。

第二部安装anaconda

这不基本上是无脑操作,下载好anaconda(python2.7)后,进行安装,安装过程中会提,将默认添加环境变量栏目点上,省掉一些自己配置的步骤。安装在哪个盘其实无所谓了,看你个人的情况了,但是请记得你的安装位置,后边要配置环境变量。

第三部配置mingw和libpython

安装完anaconda后打开 anaconda prompt,输入conda list,会显示现在的已经安装好的开源包。


往下拉,会发现没有mingw包和libpython包,所以需要自己进行配置。没有这两个包theano是没办法使用的,会报错。所以先安装mingw和libpython,点击开始-cmd,输入conda install mingw libpython,将会自动安装mingw和libpython(请注意这里对于python2.7的是可以正确无误安装的,但是对于python3.5会提示libpython与python3.5冲突没法安装,所以建议下载anaconda的时候下载PYTHON2.7的)。安装完后进入下一步。

第四部环境配置

网上查阅的环境配置基本相同,但是里边还是有少许问题的,我的配置是直接在环境变量中的系统变量path中加入

D:\Anaconda2;

D:\Anaconda2\Library\bin;
D:\Anaconda2\MinGW\bin;
D:\Anaconda2\MinGW\x86_64-w64-mingw32\lib;
D:\Anaconda2\Scripts;

(注意改成你自己的anaconda所在的位置)

网上还有的教程说要在用户变量中添加PYTHONPATH变量,刚开始我也是按照网上说的这么来的,可是发现添加PYTHONPATH变量后spyder打不开了,然后我直接删除了PYTHONPATH这个用户变量,可以正常使用spyder了。

然后在cmd的home目录中新建.theanorc.txt文件,这里有些人不知道什么是home文件,我刚开始也不明白,后来知道了就是你点开始-cmd,进入命令行后的当前目录,我的是进入该目录后,新建

.theanorc.txt文件,这两个点都不能少,然后在该文件中键入

[global] 
openmp=False 
[blas] 
ldflags= 
[gcc] 
cxxflags=-ID:\Anaconda3\MinGW

请将红色的部分改成你自己的安装目录。现在这样的写法是没有配置gpu的,配置gpu的后边会讲到。

这些弄完之后,最好重启下电脑,或者注销下,我是注销了。

第五部安装theano

现在安装theano的前提条件都已经完成了,可以开始安装theano,最简单快捷的方法就是进入cmd,输入pip install theano,便会开始安装。

这些都弄完后,没有错误了,就可以试试是否可以用了,在cmd 下进入python,输入import theano没有报错,在输入theano.test() 出现

后边有一大堆的信息,至于是什么,自己以后慢慢理解,现在我也不太清楚。

这样theano就安装完毕了,可以写一个cnn的例子来试下效果了

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('e:\\parker.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()  
结果图,原图,特征图



第六步 安装cuda

安装的前提是你自己的电脑已有GPU,可以上官网上查查自己显卡对应支持的cuda,然后选择对应支持的cuda进行下载。我的显卡是gt705,我下载的是cuda7.5的版本。此外安装cuda之前要先安装vs编译器,网上推荐的是vs2010-2014,我的是vs2013。大家自己选择吧。先安装vs在安装cuda。

无脑进行安装后进入到下一步。安装完cuda后,系统会自动添加环境变量CUDA_PATH和CUDA_PATH_V7_5。

[global] 
openmp=False 

device=gpu

floatX=float32

allow_input_downcast=True
[blas] 
ldflags= 
[gcc] 
cxxflags=-ID:\Anaconda3\MinGW


[nvcc] 
flags = -L
D:\Anaconda2\libs
compiler_bindir = D:\Microsoft Visual Studio 12.0\VC\bin 
fastmath = True 
flags=-arch=sm_30

红色部分是在原来的基础上新添加的,黄色部分是你自己对应的anaconda目录,vs编译器的vc主目录。

注意很多博客和资料上都是到这一步就结束了,其实我自己安装的时候,并不是这样,还需要自己手动配置一些环境变量来完成cuda配置。

首先再系统环境变量中加入

              CUDA_SDK_PATH:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v7.5(注意这个填写你自己的cuda位置,版本不同但是默认安装的都在C:\ProgramData\NVIDIA Corporation下面,自己找下。)

然后加入CUDA_BIN_PATH:%CUDA_PATH%\bin

       CUDA_LIB_PATH:%CUDA_PATH%\lib\x64(这里注意根据自己的系统以及安装的cuda来选择,有32位和64位的,我的是64的)

加入        CUDA_SDK_BIN_PATH:%CUDA_SDK_PATH%\bin\x64(同上我的是64位的)

加入         CUDA_SDK_LIB_PATH:%CUDA_SDK_PATH%\common\lib\x64(同上我的是64位的)



ok到这基本上结束了,打开cmd,输入python,然后import theano会出现(我的显卡是gt705的,不是特别好.......)

有些童鞋可能还会出现一些警告,和debug信息,其实没什么关系,google了一下说是优化忽略之类的问题,不影响使用,ok现在再来跑cuda的测试程序

"""
Created on Tue Mar 15 23:44:52 2016

@author: Administrator
"""

from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time
vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = 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')
会出现如下结果:


ok,我们看见已经开始使用gpu了,可是有两个警告,但是继续往后看,里面写着你可以忽略他

reference:

http://blog.csdn.net/niuwei22007/article/details/47684673

http://blog.sina.com.cn/s/blog_990865340101hvuq.html

http://blog.csdn.net/abcjennifer/article/details/25912675




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章