Web安全之深度学习实战
上QQ阅读APP看书,第一时间看更新

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,经过对海量数据的深度学习处理,如今,百度外卖的内部系统可以预估每个商家菜品出餐时间,及时告知外卖员,提高了送餐效率,系统也可以更加合理地规划取餐和送餐的路线http://tech.sina.com.cn/i/2016-09-27/doc-ifxwevmc5593979.shtml

1.3.1 安装

PaddlePaddle提供数个预编译的二进制文件来进行安装,包括Docker镜像和Ubuntu的deb安装包等。

1.基于Docker容器使用方式

PaddlePaddle的编译环境打包成了一个镜像,称为开发镜像,里面涵盖了PaddlePaddle需要的所有编译工具。编译出来的PaddlePaddle也打包成一个镜像,称为生产镜像,里面涵盖了运行所需的所有环境。每次发布新版本的时候都会发布对应版本的生产镜像以及开发镜像。运行镜像包括纯CPU版本和GPU版本及其对应的非AVX版http://www.paddlepaddle.org/doc_cn/getstarted/build_and_install/docker_install_cn.html

交互方式运行开发镜像:

        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版本http://www.paddlepaddle.org/doc_cn/getstarted/build_and_install/ubuntu_install_cn.html

        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}