Win7 下配置深度学习框架Keras(Theano后端)

时间:2023-01-29 13:54:12

Win7 下配置深度学习框架Keras(Theano后端)


2016.07.27 更新: 关闭CUDA调试信息(DEBUG: nvcc STDOUT mod.cu)输出


2016.07.15 更新: 刚发现Keras其实还有一个中文网站,该网站有对Keras官网文档的完整翻译,并且作者(们)添加了一些自己的理解,方便阅读,在此推荐。



Keras是我目前最喜欢的深度学习框架, 简洁友好,相对于Caffe容易上手的多, 并且通过使用Theano/TensorFlow作为后端也可以达到很优秀的处理速度。本文介绍在Windows7系统中Keras(使用Theano作为backend)的一种配置方法, 如果你想要在Mac或者Linux下配置Keras,官网有详细的配置教程。

现有的Window教程一般通过Anaconda安装相应的依赖,本文不使用Anaconda,适合已经配置了很多python库,不希望额外安装Ananconda或者由于其他原因不想或者不能安装Anaconda的各位。另外,因为从未使用CPU版本,本文只介绍GPU版本的安装,因此,请确保电脑的显卡支持CUDA安装(即显卡型号罗列于支持CUDA的Nvidia系列显卡列表中)

所需应用:

  • python >=2.7 (本文使用2.7.12作为例子, 不过2.7以及3.x都可以,只是3.X安装的python库的版本不同)
  • cuda 7.5 (6.5与7.0有可能也可以,没试过, 8.0当前适用于VS2015,请将下面所有关于VS2013的描述替换为VS2015)
  • visual studio 2013 (如果已经安装了VS2012,可以先用VS2012试一下,欢迎使用VS2012进行安装尝试的朋友在评论区说明是不是可以直接使用VS2012)
  • Mingwin
  • 其他python包

安装应用:

1. 安装Python (已安装请跳过)

这一步比较简单,直接官网选择版本下载安装程序即可,基本没有坑。

如果同时安装了2.x3.x的版本,可以通过py -2或者py -3选择使用相应的版本

2. 安装Visual Studio 2013 (已安装的话请跳至该部分结尾关于cl.exe的描述部分)

安装VS2013需要Win7 SP1以及IE11, SP1可以通过微软官网或者机器上的Windows Update进行安装。IE11也可以通过微软官网下载。

大家可以搜索VS2013安装包下载,也可以从官网下载,版本(社区版/专业版/旗舰版)不重要,即使是免费的社区版也足够了。

安装VS2013可能需要的时间比较长,耐心等待就好。安装完成后,将cl.exe所在路径添加到PATHPath环境变量(默认安装的话是C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin, 自定义安装的话是%VS安装目录%\VC\bin)。已经安装了VS2013的话请检查下是否已设置该路径至PATH环境变量(该值安装VS时不会自动添加)。

3. 安装CUDA(已安装可以跳过该部分)

CUDA可从Nvidia官网下载,安装时基本上一路“下一步”就可以了。安装成功后打开一个cmd命令窗口,输入nvcc -V,能够显示版本便表示安装成功。

另外,CuDNN可以显著提高网络的计算速度,建议安装。CuDNN可从官网免费注册账号并下载。请注意,cudnn有着自己适用的cuda版本,下载时请选择正确的版本进行下载(比如cudnn5.0 for cuda7.5). 下载后将文件解压,然后合并(比如include路径下的文件复制到%CUDA_PATH%\include路径下)到cuda安装路径即可。 CuDNN要求显卡计算能力3.0或以上,因此如果安装CuDNN后依然提示cudnn unavailable可能是因为显卡的计算能力低导致的。另外,虽然官网给出的Qudro K600计算能力为3.0,但是CUDA给出的检测值是2.1,因此若刚好使用的K600无法识别CuDNN请不要感觉奇怪。

2016.07.27更新:最新版本的CuDNN为5.1,但是当前Theano并不支持该版本,为了保证稳定性,暂时推荐使用5.0

4. 安装Mingwin, 已安装(或者安装了cygwin或其他软件使得window cmd命令框可识别g++指令)请跳过

安装wingw的教程网上有很多,请随意选择任何一个。另外,我个人比较喜欢这个链接提供的自解压文件,基本解压就好,可以使用作者提供的脚本,也可以之后手动将%安装路径%\bin加入PATH环境变量完成配置。

之后打开一个cmd窗口(如果是手动添加的PATH变量,之前打开的窗口状态未更新,使用脚本可以不打开新的窗口),试试g++ --version命令,能看到版本就已经成功了。

5. 安装theano, keras以及它们依赖的库

本文所需的所有python包(除keras以外)都可以从这里下载,该网页提供了很多windows下打包好的pyhon库以及另外一些库的链接,用起来很方便。

1). numpy (链接了mkl的版本)

请安装numpy-1.11.1+mkl-cpXX-cpXXm-winYYYY.whl 其中,pXX代表python版本,比如2.7p27, p34则代表python3.4,以此类推。 YYYY代表windows平台类型,请根据自己的python版本以及平台类型下载合适的文件。

文件下载后在命令行窗口输入py -2 -m pip install download_file.whl即可安装(python3请使用py -3)。

如果已经安装了numpy, 请卸载(py -2 -m pip uninstall numpy)后重新安装以上版本

2). pillow, scipy

安装方式请参考第一个例子.

3). h5py, pyyaml

安装方式请参考第一个例子

4). PyCuda

安装方式请参考第一个例子

5). Theano

这里,安装Theano有两种可选的方式。

第一种比较简单,和以上提到的所有python库相同,下载whl文件直接安装即可。该地址当前提供Theano-0.8.2版本,这也是官方正式发布的最新版。该版本在Windows上默认开启了CUDA的DEBUG信息输出,因此通过该方式安装的theano在运行时会输出CUDA的DEBUG信息,如下图所示:

Win7 下配置深度学习框架Keras(Theano后端)


这里,输出的DEBUG信息对程序运行没有任何影响,甚至当对网络进行编译的时候还可以通过不断滚动的DEBUG信息提示当前一切运行正常,比长达几分钟甚至更久的安静可能让你产生的“是不是程序卡死了”的疑问更加温和。只是可能会有朋友和我一样有强迫症,见不得这些DEBUG信息,因此介绍第二种安装方式:

Github下载Theano源码并解压,下载时选择master分支,或者可以直接通过git将代码拷至本地git clone https://github.com/Theano/Theano.git ,之后以管理员身份打开一个cmd命令框并cd至该目录并根据需求执行以下命令:
1.首先,通过echo %PYTHONPATH%检查PYTHONPATH变量的值,若该值不存在(即命令的输出结果为%PYTHONPATH%), 则将该变量赋值为python的路径(默认为C:/Python27,或者取决于使用的python版本,可能是C:/Python35等):set PYTHONPATH=C:/Python27, 安全起见,如果同样的方式检测到HOME变量不存在的话也可以额外加上set HOME=%USERPROFILE%

然后从命令行直行安装命令即可:py -2 setup.py install --prefix=%PYTHONPATH%. 这里%PYTHONPATH%替换成你的安装路径。prefix选项指定了安装路径,即%PYTHONPATH%/Lib/site-packages。或者可以将install替换为develop从而安装developer版本,甚至如果你确定这个解压后的文件夹你不会随便修改/删除的话,不提供prefix选项也无所谓,脚本会自动在python的库路径建立指向该目录的链接,也不影响使用。

6). keras

可以通过py -2 -m pip install keras直接安装keras最新版本,也可以通过到GitHub下载其他版本并根绝官网提示进行安装

7). 其他可选项(均可从以上提到的链接下载,除OpenCV外也可以不下载而通过pip命令直接安装):

  • opencv提供了很多图像操作功能,并且内置了很多视觉算法实现,建议安装
  • matplotlib提供了绘图操作相关功能,对于展示实现数据很有帮助,建议安装
  • seaborn对matplotlib进行了更高层次的封装,API更简洁,并且可以更简单的美化绘图,有兴趣的话也可以安装

6. 配置Theano并进行测试

Theano有很多Flag可以设置,具体可以参考Theano文档。 这里选择创建.theanorc的方式。

在你的个人文件夹(如果你没改windows默认设置的话是C:/Users/%你的用户名%)下创建一个叫做.theanorc的文件(注意,前面有个点),将以下内容(有cudaglobal两项其实就够了)输入后保存即可:

[cuda]
root = C:\\Program\ Files\\NVIDIA\ GPU\ Computing\ Toolkit\\CUDA\\v7.5

[global]
device = gpu
floatX = float32

[lib]
cnmem=.75

[pycuda]
init=True

其中root表明cuda的安装目录, device=gpu代表使用GPU,下面的cnmem用来控制CnMEM初始化内存比例,小于1的话代表可用内存的比例,大于1的数值表示以MB为单位的内存大小的绝对值。

将以下代码保存成python脚本,然后运行该脚本即可测试theano是否配置成功:

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 %f seconds" % (iters, t1 - t0))
print("Result is %s" % (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')


Win7 下配置深度学习框架Keras(Theano后端)
GTX860M的输出结果


下面是一段很简单的keras代码,通过这段代码可以构建一个简单的神经网络对mnist手写数字进行分类,没安装matplotlib的话可以删除/注释掉关于matplotlib的所有代码:

from   keras.layers import Dense, Flatten, Input
from keras.layers import Convolution2D, MaxPooling2D
from keras.models import Model
from keras.datasets import mnist
from keras.utils import np_utils
import matplotlib
import matplotlib.pyplot as plt
import numpy as np


def main():

'''
'''

(X_train, y_train), (X_test, y_test) = mnist.load_data() #获取数据
nb_class = 10 #测试数据包含0-9共10个数字,因此共10类
Y_train = np_utils.to_categorical(y_train, nb_class) #将label列表转换为数组形式,用于最后的Softmax分类
Y_test = np_utils.to_categorical(y_test, nb_class)
X_train = X_train[:, np.newaxis, :, :].astype(float) #数组维度/数据类型转换
X_test = X_test[:, np.newaxis, :, :].astype(float)
X_train -= X_train.min() #下面4行将数据归一化到[0,1]区间
X_test -= X_test.min()
X_train /= X_train.max()
X_test /= X_test.max()

(_, d, h, w) = X_train.shape
print "Image size: %dx%dx%d" % (d, h, w)

in_img = Input(shape=(d, h, w)) #输入层
x = Convolution2D(16, 3, 3, activation='relu')(in_img) #卷积
x = MaxPooling2D((2, 2))(x) #pooling
x = Flatten()(x) #将feature map扁平为1维向量
out = Dense(nb_class, activation='softmax')(x) # 输出层
model = Model(input=in_img, output=out) #构建网络
model.compile(optimizer='sgd', loss='categorical_crossentropy', metrics=['accuracy']) #编译

test_step = 1
test_iteration = 30
result = []
for i in range(test_iteration):
model.fit(X_train, Y_train, nb_epoch=test_step) #Keras每次更新weight都会记住上次的状态,所以这个循环其实相当于单次执行30个epoch,但是这样允许记录每次的状态
score = model.evaluate(X_test, Y_test, verbose=0) #verbose=0 代表关闭提示信息输出,默认verbose=1(fit函数在这里执行默认模式)输出该信息,verbose=2则表示只在epoch结束时输出summary信息
result.append(score[1])

#绘图,没有安装matplotlib可以删除
plt.plot(range(1, len(result)+1), result)
plt.xlabel('number of epoch')
plt.ylabel('accuracy')
plt.show()



if __name__=='__main__':
main()

程序运行界面及结果如下:


Win7 下配置深度学习框架Keras(Theano后端)



Win7 下配置深度学习框架Keras(Theano后端)