深度学习 _ 工具

1. 引入

深度学习的工具有很多 Tensorflow, Theano, Caffe, Keras, MXNet, Scikit-learn…有用 c++ 写的,有用 Python 写的,还有R的,Java 的,从哪里入手呢?

先看看最热门的 Tensorflow,它是谷歌研发的人工智能学习系统,主要优点是分布式计算,特别是在多 GPU 的环境中。Theano 也是比较低级的库,一般单机使用.什么是低级库?就像炒回锅肉不用从杀猪开始,杀猪就是比较低级的工作,已经有人帮你做好了,像 Keras 这种较上层的工具,它把 Theano 和 TensorFlow 包装成了更具人性化的 API。至于是选择低级工具,还是上层工具,主要取决于您的目标是开肉联厂还是开饭馆.

图片.png

2. 工具简介

Caffe 是 c++ 写的库,是较低层级的库,它是个老牌的工具,工作稳定,性能也好,还提供绑定到 Python 上的编程语言,但相对没有 Python 类工具灵活.

Theano 是一个低级库,透明地使用 GPU 来完成数学计算.也是一个老牌的工具,工作比较稳定,只支持单机,可供 Keras 调用.

TensorFlow 也是个低级的库,由 Google 发布,其的主要优点是分布式计算,特别是在多 GPU 的环境中,可供 Keras 调用.

CNTK 也是个低级的库,微软发布,可供 Keras 调用.

MXNet 还是一个低级库,由 C++ 实现的,同时提供了 python,lua,R,和 js 等多种语言接口,优点是分布式计算,它支持多个 CPU / GPU 分配训练网络,可供 Keras 调用.

Keras 用得比较多,它把 Theano,TensorFlow,MXNet,CNTK 包装成了更具人性化的 API(低级的库想做完整的解决方案,还是要自己写很多代码),可供快速入门,但速度相对慢一些,在设计复杂算法时,也相对受限.

Lasagne 是基于 Theano 的,用于构建和训练网络的轻量级库。Lasagne 的功能是 Theano 的低级编程和 Keras 的高级抽象之间的一个折中。

NoLearn 把 Lasagne 封装成了更具人性化的 API(就如同 Keras 把 Theano 和 TensorFlow 封装一样),此外,NoLearn 中所有的代码都是与 scikit-learn 兼容的.

Scikit-learn 是 Python 中常用的机器学习库,除了深度学习也提供很多浅层模型,深度学习不是它的重点.

Torch 是由 lua 语言编写的深度学习库.

这里所谓的高级/低级都是相对而言的,高级只是相对简单一些.在算法的使用层面,对上层调用比较多,但会牺牲一些效率,限制也比较多.在算法改进层面,更多用到低级库.

接口怎么调都不过都是调库而已.关键还是看如何设计神经网络的结构,以及它背后的数学原理,所以说深度学习主要比拼的还是"内功".

3. 工具选择

上述工具很多是 Python 写的,或者有 Python 的接口,建议在 Python 层面调用.

作为入门,建议选择 Keras,基于以下原因:代码简单,资料多,可将 Theano,Tensorflow 等作为后端(只要安装好后端工具,就可以使用它了,无需了解具体用法;有一定扩展性(可用 theano 或 tensorflow 的语句来写扩展功能并和 keras 结合使用).最主要的还是容易上手.

4. Keras&Theano&Tensorflow 简单安装

1) 安装软件

以下为最简单地安装方法,此文及下文中环境默认为 ubuntu

1
2
3
$ sudo pip install tensorflow
$ sudo pip install theano
$ sudo pip install keras

2) 安装例程

学习 keras 最好从它的例程开始,需要下载 keras 源码

1
$ git clone https://github.com/fchollet/keras.git

例程在 keras/examples 目录下

推荐 mnist_* 例程,它分别使用了 CNN,RNN,GAN 等方法实现了手写数字的识别,可以先运行一下看看效果.代码很简单,不过是看代码时,就会发现,虽然只有几个语句,几个参数,但还是不明白,为什么要这么写?和那些讲原理的书有点对不上.因此,建议先自己写个简单神经网络具体实现(不是调库),以了解整个流程以及各个参数的具体作用.具体请见下一篇《深度学习——BP 神经网络》

5. 配置 GPU 支持

1) 说明

到上一步简单安装之后,例程基本都可以跑了.此部分,建议初学者看看就行了,不要急于把环境配置得一步到位.NVdriver+Cuda+TensorFlow+Theano 各个软件版本相互依赖,又与机器的操作系统以及显卡型号相关,在配置的过程中的确有很多坑,有可能导致桌面无法启动,以致严重打乱学习的进程.强烈建议先把深度学习的框架弄明白了,需要大量计算时,再回来配置 GPU.

注意:只有评分在 3.0 以上的显卡才能支持 tensorflow_gpu,具体型号见 https://developer.nvidia.com/cuda-gpus.

2) NVdriver

nvidia 的卡大部分都支持深度学习,只是性能不同。可用以下命令看看自己显卡情况(Tensorflow 需要评分 3.0 以上,Theano 只需支持 cuda 即可)

1
2
$ lspci  | grep -i VGA
$ nvidia-smi

显卡驱动可能不是最新的,一般在图形界面 ->系统设置 ->软件更新 ->附加驱动 ->选择 nvidia 的可用驱动.也可以用 apt-get 命令安装,还可以从 Nvidia 官网上下载安装脚本,但该方法需要先关掉图形界面,安装后再开启,比较麻烦.

另外需要注意的是,不是版本号越高,支持的显卡越多,有些老的显卡只在低版本支持——这也就是安装中最大的坑:显卡驱动升级后不支持当前硬件,使得图形界面无法启动了——不断显示输入密码界面.

1
$ ls /proc/driver/nvidia/gpus/

正常安装后,以上目录被生成.

3) Cuda

Cuda 是一种由 NVIDIA 推出的通用并行计算架构,该架构使 GPU 能够解决复杂的计算问题。各个机器学习库都通过 Cuda 库调用 GPU.

Cuda 的安装可使用命令(不推荐此方法)

1
2
$ apt-get install nvidia-cuda-toolkit
$ nvcc -V # 安装成功后,看一下版本信息

至于安装后能否正常使用,就要看运气了.Cuda 和 Nvdriver,以及 TensorFlow 的版本都是强相关的,当使用 apt-get 安装 Cuda 时,有时会升级显卡驱动(安装时会提示升级一堆包,其中有 nvidia-xxx),但升级后的驱动很可能不支持你的硬件.

推荐从 https://developer.nvidia.com/cuda-downloads 下载 run 脚本安装,脚本安装会提示你是否升级显卡驱动,此时选 No 即可.安装后还需要设置一些 bin 和 lib 的环境变量.cuda 有很多版本,需要找到与显卡驱动匹配的版本,否则安装后还是找不到 gpu.

4) Tensorflow_gpu

Tensorflow 有 gpu 和 cpu 两个版本,简单安装中安装的是 cpu 版本,gpu 版本则需要系统中安装 cuda 和 libcudnn,且与 Tensorflow 匹配.比如:最新的 Tensorflow 需要 cude-8.0 版本和 cudnn-6.0 与之匹配,其它版本会有各种各样奇怪的报错.安装命令如下:

1
$ sudo pip install tensorflow_gpu

也可以从 git 中下载 tensorflow 最新代码编译,不过编译过程也需要安装 bazel 等工具支持,比较麻烦.

我安装成功时使用的是用 pip 安装 tensorflow_gpu,同时安装了 cuda_8.0.44_linux.run 和 cudnn-8.0-linux-x64-v6.0.tgz(tgz 包约 200M,用 15M 的包会报错找不到函数)

测试程序

安装后,可用以下程序测试 tensorflow 是否正常运行

1
2
3
4
5
6
7
8
import tensorflow as tf

hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
a = tf.constant(10)
b = tf.constant(32)
print(sess.run(a + b))

5) Theano

Theano 也是基本于 cuda 调用 GPU 的,相对于 Tensorflow 要简单一些,它对 cuda 的版本要求不严格,只要在配置文件中设置正常即可调用 GPU

  1. 配置文件
1
2
3
4
5
6
7
8
$ vi ~/.theanorc
内容如下
[global]
device=gpu
floatX=float32

[nvcc]
optimizer=None
  1. 测试程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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')

6. 参考

1)《我最喜欢的 9 个 Python 深度学习库》

http://blog.csdn.net/u013886628/article/details/51819142

2)《Ubuntu16.04+cuda8.0+caffe 安装教程》

http://blog.csdn.net/autocyz/article/details/52299889/