- Web安全之深度學習實戰
- 劉焱
- 1353字
- 2019-01-03 15:37:25
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}