1.3 PaddlePaddle
PaddlePaddle是百度开源的深度学习库,2016年9月27日,百度宣布其全新的深度学习开源平台PaddlePaddle在开源社区GitHub及百度大脑平台开放,供广大开发者下载使用。百度成为继Google、Facebook、IBM后另一个将人工智能技术开源的科技巨头,同时也是国内首个开源深度学习平台的科技公司。PaddlePaddle的前身是百度于2013年自主研发的深度学习平台Paddle(Parallel Distributed Deep Learning,并行分布式深度学习),且一直为百度内部工程师研发使用。全球各大科技巨头开源的深度学习平台都极具各自的技术特点。百度由于其自身在搜索、图像识别、语音语义识别理解、情感分析、机器翻译、用户画像推荐等多领域都有业务应用,PaddlePaddle则表现得更加全面,是一个相对全功能的深度学习框架。目前,PaddlePaddle已实现CPU/GPU单机和分布式模式,同时支持海量数据训练、数百台机器并行运算,以应对大规模的数据训练。此外,PaddlePaddle具备高质量GPU代码,提供了机器翻译、推荐、图像分类、情感分析等功能。
目前,PaddlePaddle已在百度30多项主要产品和服务之中发挥着作用,如外卖的预估出餐时间、预判网盘故障时间点、精准推荐用户所需信息、海量图像识别分类、字符识别、病毒和垃圾信息检测、机器翻译和自动驾驶等领域。以外卖行业为例,外卖员等待商家出餐的时间耗时严重,百度将不同时段商家的客流量、菜品的制作时间和订单量等数据交给了PaddlePaddle,经过对海量数据的深度学习处理,如今,百度外卖的内部系统可以预估每个商家菜品出餐时间,及时告知外卖员,提高了送餐效率,系统也可以更加合理地规划取餐和送餐的路线。
1.3.1 安装
PaddlePaddle提供数个预编译的二进制文件来进行安装,包括Docker镜像和Ubuntu的deb安装包等。
1.基于Docker容器使用方式
PaddlePaddle的编译环境打包成了一个镜像,称为开发镜像,里面涵盖了PaddlePaddle需要的所有编译工具。编译出来的PaddlePaddle也打包成一个镜像,称为生产镜像,里面涵盖了运行所需的所有环境。每次发布新版本的时候都会发布对应版本的生产镜像以及开发镜像。运行镜像包括纯CPU版本和GPU版本及其对应的非AVX版。
交互方式运行开发镜像:
docker run -it --rm paddlepaddle/paddle:<version>-dev /bin/bash
后台进程方式运行容器:
docker run -d -p 2202:22-p 8888:8888 paddledev/paddle:<version>-dev
然后用密码root SSH进入容器:
ssh -p 2202 root@localhost
2. Ubuntu部署PaddlePaddle
安装包的下载地址是:
https://github.com/PaddlePaddle/Paddle/releases
它包含4个版本:
❑ CPU版本:支持主流X86处理器平台,使用了AVX指令集。
❑ CPU-NOAVX版本:支持主流X86处理器平台,没有使用AVX指令集。
❑ GPU版本:支持主流X86处理器平台,支持NVIDIA CUDA平台,使用了AVX指令集。
❑ GPU-NOAVX版本:支持主流X86处理器平台,支持NVIDIA CUDA平台,没有使用AVX指令集。
下载完相关安装包后,执行如下命令:
sudo apt-get install gdebi gdebi paddle-*-cpu.deb
或者如下命令:
dpkg -i paddle-*-cpu.deb apt-get install -f
在用dpkg -i的时候如果报一些依赖未找到的错误是正常的,在apt-get install -f里会继续安装PaddlePaddle。
安装完成后,可以使用命令paddle version查看安装后的Paddle版本:
PaddlePaddle 0.8.0b1, compiled with with_avx: ON with_gpu: OFF with_double: OFF with_python: ON with_rdma: OFF with_timer: OFF with_predict_sdk:
1.3.2 使用举例
以识别MNIST数据集为例,关于MNIST数据集的详细介绍请参考本书第5章。
下面代码实现了一个含有两个隐藏层的多层感知器,其中两个隐藏层的激活函数均采用ReLU,输出层的激活函数用Softmax:
def multilayer_perceptron(img): hidden1 = paddle.layer.fc(input=img, size=128, act=paddle.activation.Relu()) hidden2 = paddle.layer.fc(input=hidden1, size=64, act=paddle.activation.Relu()) predict = paddle.layer.fc(input=hidden2, size=10, act=paddle.activation.Softmax()) return predict
通过layer.data调用来获取数据,然后调用分类器得到分类结果。训练时,对该结果计算其损失函数,分类问题常常选择交叉熵损失函数:
paddle.init(use_gpu=False, trainer_count=1) images = paddle.layer.data( name='pixel', type=paddle.data_type.dense_ vector(784) ) label = paddle.layer.data( name='label', type=paddle.data_type.integer_ value(10)) predict = multilayer_perceptron(images) #多层感知器 cost = paddle.layer.classification_cost(input=predict, label=label)
训练过程是完全自动的,event_handler里打印的日志如下所示,最后准确率为97.66%:
# Pass 0, Batch 0, Cost 2.780790, {'classification_error_evaluator': 0.9453125} # Pass 0, Batch 100, Cost 0.635356, {'classification_error_evaluator': 0.2109375} # Pass 0, Batch 200, Cost 0.326094, {'classification_error_evaluator': 0.1328125} # Pass 0, Batch 300, Cost 0.361920, {'classification_error_evaluator': 0.1015625} # Pass 0, Batch 400, Cost 0.410101, {'classification_error_evaluator': 0.125} # Test with Pass 0, Cost 0.326659, {'classification_error_evaluator': 0.09470000118017197}