行動裝置深度學習
內容描述
●對於iOS和Android兩個平台的神經網路實踐均詳細描述
●從結構到框架程式設計,從CPU到GPU程式設計皆一應俱全
●以程式碼實作為主線逐步講解,由淺入深,使讀者更容易應用到實際案例中
一直以來,由於技術門檻和硬體條件的限制,在行動端應用深度學習的成功案例並不多。傳統行動端UI工程師在編寫神經網路程式碼時,可以查閱的行動端深度學習資料也很少。而另一方面,時下的網際網路競爭又頗為激烈,率先將深度學習技術在行動端應用起來,可以取得先發制人的優勢。
行動端設備的運算能力比PC端弱很多。行動端的CPU要將功耗指標維持在很低的水準,這就使性能指標的提升帶來了限制。在App中做神經網路運算,會使CPU的運算量驟增。如何協調好使用者功耗指標和性能指標就顯得非常重要。此外,App的檔案大小也是重大考驗,如果為了讓使用者體驗一個深度學習功能而要求其下載200MB甚至更大的模型檔,想必使用者是不會愉快接受的。這些都是行動端應用深度學習技術必須解決的問題。
本書由淺入深地介紹如何將深度學習技術應用到行動端運算領域,書中儘量避免羅列公式,嘗試用淺顯的語言和幾何圖形去解釋相關內容。本書第1章展示了在行動端應用深度學習技術的Demo,幫助讀者建立直觀的認識;第2章至第4章講解了如何在行動端專案中應用深度學習技術;第5章至第8章的難度較深,主要是說明如何深入地調整框架並制定自己的框架。
本書適合行動端研發工程師閱讀,也適合所有對行動端運算領域感興趣的朋友閱讀。
目錄大綱
第 1 章 初探行動端深度學習技術的應用
1.1 本書範例程式碼簡介
1.1.1 安裝編譯完成的檔案
1.1.2 在 Demo App 中應用神經網路技術
1.2 行動端主體檢測和分類
1.3 在線上產品中以「雲+端計算」的方式應用深度學習技術
1.4 在行動端應用深度學習技術的業界案例
1.4.1 植物花卉辨識
1.4.2 奇妙的風格化效果
1.4.3 影片主體檢測技術在 App 中的應用
1.5 在行動端應用深度學習技術的困難點
1.5.1 在伺服器端和行動端應用深度學習技術的難點對比
1.5.2 實作 AR 即時翻譯功能
1.6 編譯執行深度學習 App
1.6.1 mobile-deep-learning 專案環境簡介
1.6.2 mobile-deep-learning 專案整體程式碼結構
1.6.3 mobile-deep-learning 通用環境需求
1.7 在 iOS 平台上建立深度學習框架
1.7.1 在 iOS 平台上建立 mobile-deep-learning 專案
1.7.2 在 OS X 平台上編譯 mobile-deep-learning 專案
1.7.3 iOS 平台上 mobile-deep-learning 專案的 Demo 程式碼結構
1.8 在 Android 平台上建立深度學習框架
1.8.1 Android 平台上 mobile-deep-learning 專案的環境需求
1.8.2 Android 平台上 mobile-deep-learning 專案的 Demo 程式碼結構
1.8.3 用 Paddle-Lite 框架編譯與開發 Android 應用程式
1.8.4 開發一個基於行動端深度學習框架的 Android App
第 2 章 以幾何方式理解線性代數基礎知識
2.1 線性代數基礎
2.1.1 標準平面直角座標系統
2.1.2 改變座標系統的基底向量
2.2 向量的幾何意義
2.2.1 向量的加減運算
2.2.2 向量的數乘運算
2.3 線性組合的幾何意義
2.4 線性空間
2.5 矩陣和變換
2.6 矩陣乘法
2.7 行列式
2.8 反矩陣
2.9 秩
2.10 零空間
2.11 點積和叉積的幾何表示與含義
2.11.1 點積的幾何意義
2.11.2 叉積的幾何意義
2.12 線性代數的特徵概念
2.13 抽象向量空間
第 3 章 什麼是機器學習和卷積神經網路
3.1 行動端機器學習的全過程
3.2 預測過程
3.3 數學方法
3.3.1 預測過程涉及的數學公式
3.3.2 訓練過程涉及的數學公式
3.4 神經元和神經網路
3.4.1 神經元
3.4.2 神經網路
3.5 卷積神經網路
3.6 圖像卷積效果
3.6.1 從全域瞭解視覺相關的神經網路
3.6.2 卷積核和矩陣乘法的關係
3.6.3 多通道卷積核的應用
3.7 卷積後的圖片效果
3.8 卷積相關的兩個重要概念:padding 和stride
3.8.1 讓卷積核「出界」:padding
3.8.2 讓卷積核「跳躍」:stride
3.9 卷積後的降維操作:池化
3.10 卷積的重要性
第 4 章 行動端常見網路結構
4.1 早期的卷積神經網路
4.2 AlexNet 網路結構
4.3 GoogLeNet 網路結構
4.3.1 模型體積問題
4.3.2 計算量問題
4.4 嘗試在 App 中執行 GoogLeNet
4.4.1 將 32 位元 float 參數轉化為 8 位元 int 參數以降低傳輸量
4.4.2 將 CPU 版本伺服器端框架移植到行動端
4.4.3 應用在產品中的效果
4.5 輕量化模型 SqueezeNet
4.5.1 SqueezeNet 的最佳化策略
4.5.2 fire 模組
4.5.3 SqueezeNet 的全域
4.6 輕量高性能的 MobileNet
4.6.1 什麼是深度可分離卷積(Depthwise Separable Convolution)
4.6.2 MobileNet v1 網路結構
4.6.3 MobileNet v2 網路結構
4.7 行動端神經網路模型的最佳化方向
第 5 章 ARM CPU 組成
5.1 現代電腦與ARM CPU 架構的現況
5.1.1 馮紐曼電腦的基本結構
5.1.2 行動計算裝置的分工
5.2 簡單的 CPU 模型
5.2.1 讀取過程
5.2.2 解碼過程
5.2.3 執行過程
5.2.4 寫入過程
5.2.5 細化分工:管線技術
5.3 組語指令初探
5.3.1 組合語言程式的第一行
5.3.2 這些指令是什麼
5.4 組語指令概況
5.4.1 ARM CPU 家族
5.4.2 ARMv7-A 處理器架構
5.4.3 ARMv7 組語指令介紹
5.5 ARM指令集架構
5.6 ARM手機晶片的現狀與格局
第 6 章 儲存金字塔與 ARM 組合語言
6.1 ARM CPU 的完整結構
6.2 存放裝置的金字塔結構
6.3 ARM 晶片的快取設計原理
6.3.1 快取的基本理解
6.3.2 簡單的快取映射結構:直接映射
6.3.3 靈活高效率的快取結構:組相聯映射
6.3.4 利用一個簡單的公式最佳化存取效能
6.4 ARM 組合語言知識
6.4.1 ARM 組合語言資料類型和暫存器
6.4.2 ARM 指令集
6.4.3 ARM 組合語言的記憶體操作
6.5 NEON 組語指令
6.5.1 NEON 暫存器與指令類型
6.5.2 NEON 儲存操作指令
6.5.3 NEON 通用資料操作指令
6.5.4 NEON 通用算術操作指令
6.5.5 NEON 乘法指令
6.5.6 運用 NEON 指令計算矩陣乘法
第 7 章 行動端 CPU 預測性能最佳化
7.1 工具及體積最佳化
7.1.1 工具使用
7.1.2 模型體積最佳化
7.1.3 深度學習庫檔體積最佳化
7.2 CPU 高性能通用最佳化
7.2.1 編譯選項最佳化
7.2.2 記憶體性能和耗電量最佳化
7.2.3 迴圈展開
7.2.4 並行最佳化與管線重排
7.3 卷積性能最佳化方式
7.3.1 滑動視窗卷積和 GEMM 性能對比
7.3.2 基於 Winograd 演算法進行卷積性能最佳化
7.3.3 快速傅立葉變換
7.3.4 卷積計算基本最佳化
7.4 開發問題與經驗總結
第 8 章 行動端 GPU 程式設計及深度學習框架落地實踐
8.1 異質運算程式設計框架 OpenCL
8.1.1 開發行動端 GPU 應用程式
8.1.2 OpenCL 中的一些概念
8.2 行動端視覺搜索研發
8.2.1 初次探索行動端AI 能力
8.2.2 取消快門按鍵,提升視覺搜索體驗
8.2.3 使用深度學習技術提升視覺搜索速度
8.2.4 透過 AI 工程技術提升視覺搜索體驗
8.3 解決歷史問題:研發 Paddle-Lite 框架
8.3.1 體積壓縮
8.3.2 工程結構編碼前重新設計
8.3.3 視覺搜索的高級形態:即時影片串流式搜索
作者介紹
李永會
擔任百度App行動裝置研發部資深工程師。2015年起在百度從事圖像搜索和語音搜索的客戶端研發工作,主持了多個重要創新專案,包括百度Lens、即時翻譯等。同時負責開源行動端深度學習框架Paddle-Lite的開發,長期從事行動端AI高性能運算最佳化工作,在多種軟硬體平台上高性能運行深度學習技術。在工作之餘有讀史、書法等愛好。