移動深度學習
  • 推薦0
  • 收藏0
  • 瀏覽22

移動深度學習

李永會 (作者) 

  • 書  號:
  • 頁  數:
  • 開  本:
  • 出版狀態:上市銷售
  • 維護人:張春雨
在當下互聯網行業中,機器學習、神經網路等技術逐步在業界落地實施,而目前還是大部分集中在服務端技術。由于在移動端硬件等因素的限制,深度學習技術的應用有著諸多困難,2016年百度在客戶端使用深度學習的能力做了大量工作,終于在2017年初完成所有技術障礙,并準備在手機百度中上線。 使用深度學習可以在不發起網絡請求的情況下在移動客戶端進行圖像識別任務。目前,不管是在國內還是國外深度學習領域中,在移動客戶端使用深度學習都是前沿技術,業務雖然有一些應用,但是還是有一些移動端的障礙掃清。
面向5G|AIoT|邊緣計算 移動端神經網絡實踐首著 基于手機百度AI創新應用
深度學習技術在近兩年飛速發展,對互聯網的諸多方面產生了影響。各種互聯網產品都爭相應用深度學習技術,這將進一步影響人們的生活。隨著移動設備被廣泛使用,在移動互聯網產品中應用深度學習和神經網絡技術已經成為必然趨勢。
一直以來,由于技術門檻和硬件條件的限制,在移動端應用深度學習的成功案例不多。傳統移動端UI工程師在編寫神經網絡代碼時,可以查閱的移動端深度學習資料也很少。而另一方面,時下的互聯網競爭又頗為激烈,率先將深度學習技術在移動端應用起來,可以取得先發制人的優勢。
移動端設備的運算能力比PC端弱很多。移動端的CPU要將功耗指標維持在很低的水平,這就給性能指標的提升帶來了限制。在App中做神經網絡運算,會使CPU的運算量猛增。如何協調好用戶功耗指標和性能指標就顯得至關重要。另外,App的體積限制也是重大考驗,如果為了讓用戶體驗一個深度學習功能而要求其下載200MB甚至更大的模型文件,想必用戶是不會愉快接受的。這些都是在移動端應用深度學習技術必須解決的問題。
筆者從2015年開始嘗試將深度學習技術應用在移動端,在這個過程中遇到的很多問題是關于性能和功耗的,這些問題最終被逐一解決。現在相關項目代碼已經在很多App上運行,這些App有日PV達億級的產品,也有創業期的產品。2017年9月,筆者所帶領的團隊在GitHub上開源了該項目的全部代碼及腳本,項目名稱是mobile-deep-learning,希望它在社區的帶動下能夠得到更好的發展。本書也是以該項目的代碼作為示例進行講解的。
我們已經在多個重要會議上分享了該方向的成果,聽眾非常感興趣,會后和我們討論了很多問題,我也感覺到這些成果值得分享給更多人,于是產生了撰寫本書的想法。
目前,國內外已經有很多關于深度學習的書籍,其中一些對算法的講述非常精辟且有深度。然而這些書籍基本上都是介紹如何在服務器端使用深度學習技術的,針對在移動端應用深度學習技術的書籍還相對較少。
本書內容
本書力求系統而全面地描繪移動端深度學習技術的實踐細節和全景,對iOS和Android兩個平臺的神經網絡實踐都會詳細講述。需求不同的讀者可以根據自己的情況有重點地閱讀。精妙的算法必須加上良好的工業實現,才能給用戶提供極致的體驗,本書以代碼實現為主線講述工程實踐,由淺入深,逐步增加難度,最終會將體系結構和匯編知識應用到實踐案例中。
這里需要說明兩點:
?筆者將書中出現的Paddle-Lite代碼壓縮并放到了博文視點的官網,讀者可以掃描“讀者服務”中的二維碼查看。如果想體驗最新版本的Paddle-Lite,可以直接到GitHub上搜索查看。
?筆者將書中的鏈接列在表格中并放在了博文視點的官網,讀者同樣可以掃描“讀者服務”中的二維碼查看表格,并點擊其中的鏈接直接訪問。
本書可以作為移動端研發工程師的前沿讀物,讀者閱讀本書后,完全可以將所學知識應用到自己的產品中去;同時本書也適合對移動端運算領域感興趣的朋友閱讀。
致謝
特別感謝我的同事在本書編寫過程中提供的巨大幫助,由于本書涉獵的技術方向較廣——從體系結構到框架程序設計,從CPU到GPU編程,所以有些內容請教了在相關方向更資深的同事。感謝趙家英和秦雨兩位同事對CPU性能優化部分提供的幫助,感謝劉瑞龍和謝柏淵兩位同事對深度學習框架和GPU部分提供的幫助,有了你們的幫助,本書的內容才更完善、有深度,在此深表謝意。


李永會
2019年7月于北京

目錄

第1章 初窺移動端深度學習技術的應用 1
1.1 本書示例代碼簡介 1
1.1.1 安裝編譯好的文件 1
1.1.2 在Demo App中應用神經網絡技術 2
1.2 移動端主體檢測和分類 2
1.3 在線上產品中以“云+端計算”的方式應用深度學習技術 4
1.4 在移動端應用深度學習技術的業界案例 6
1.4.1 植物花卉識別 6
1.4.2 奇妙的風格化效果 7
1.4.3 視頻主體檢測技術在App中的應用 7
1.5 在移動端應用深度學習技術的難點 8
1.5.1 在服務器端和移動端應用深度學習技術的難點對比 8
1.5.2 實現AR實時翻譯功能 9
1.6 編譯運行深度學習App 12
1.6.1 mobile-deep-learning項目環境簡介 12
1.6.2 mobile-deep-learning項目整體代碼結構 13
1.6.3 mobile-deep-learning通用環境依賴 14
1.7 在iOS平臺上搭建深度學習框架 15
1.7.1 在iOS平臺上搭建mobile-deep-learning項目 15
1.7.2 在OS X平臺上編譯mobile-deep-learning項目 16
1.7.3 iOS平臺上mobile-deep-learning項目的Demo代碼結構 17
1.8 在Android平臺上搭建深度學習框架 18
1.8.1 Android平臺上mobile-deep-learning項目的環境依賴 18
1.8.2 Android平臺上mobile-deep-learning項目的Demo代碼結構 19
1.8.3 用Paddle-Lite框架編譯與開發Android應用 20
1.8.4 開發一個基于移動端深度學習框架的Android App 22
第2章 以幾何方式理解線性代數基礎知識 32
2.1 線性代數基礎 32
2.1.1 標準平面直角坐標系 32
2.1.2 改變坐標系的基向量 34
2.2 向量的幾何意義 35
2.2.1 向量的加減運算 36
2.2.2 向量的數乘運算 37
2.3 線性組合的幾何意義 38
2.4 線性空間 40
2.5 矩陣和變換 41
2.6 矩陣乘法 43
2.7 行列式 46
2.8 矩陣的逆 48
2.9 秩 49
2.10 零空間 50
2.11 點積和叉積的幾何表示與含義 51
2.11.1 點積的幾何意義 51
2.11.2 叉積的幾何意義 52
2.12 線性代數的特征概念 53
2.13 抽象向量空間 54
第3章 什么是機器學習和卷積神經網絡 56
3.1 移動端機器學習的全過程 56
3.2 預測過程 57
3.3 數學表達 59
3.3.1 預測過程涉及的數學公式 59
3.3.2 訓練過程涉及的數學公式 60
3.4 神經元和神經網絡 61
3.4.1 神經元 61
3.4.2 神經網絡 63
3.5 卷積神經網絡 63
3.6 圖像卷積效果 65
3.6.1 從全局了解視覺相關的神經網絡 65
3.6.2 卷積核和矩陣乘法的關系 66
3.6.3 多通道卷積核的應用 69
3.7 卷積后的圖片效果 70
3.8 卷積相關的兩個重要概念:padding和stride 75
3.8.1 讓卷積核“出界”:padding 75
3.8.2 讓卷積核“跳躍”:stride 75
3.9 卷積后的降維操作:池化 76
3.10 卷積的重要性 77
第4章 移動端常見網絡結構 78
4.1 早期的卷積神經網絡 78
4.2 AlexNet網絡結構 79
4.3 GoogLeNet網絡結構 79
4.3.1 模型體積問題 80
4.3.2 計算量問題 80
4.4 嘗試在App中運行GoogLeNet 81
4.4.1 將32位float參數轉化為8位int參數以降低傳輸量 82
4.4.2 將CPU版本服務器端框架移植到移動端 83
4.4.3 應用在產品中的效果 84
4.5 輕量化模型SqueezeNet 85
4.5.1 SqueezeNet的優化策略 85
4.5.2 fire模塊 86
4.5.3 SqueezeNet的全局 86
4.6 輕量高性能的MobileNet 88
4.6.1 什么是深度可分離卷積(Depthwise Separable Convolution) 88
4.6.2 MobileNet v1網絡結構 89
4.6.3 MobileNet v2網絡結構 91
4.7 移動端神經網絡模型的優化方向 92
第5章 ARM CPU組成 94
5.1 現代計算機與ARM CPU架構的現狀 94
5.1.1 馮·諾依曼計算機的基本結構 94
5.1.2 移動計算設備的分工 96
5.2 簡單的CPU模型 98
5.2.1 取指過程 98
5.2.2 譯碼過程 99
5.2.3 執行過程 100
5.2.4 回寫過程 101
5.2.5 細化分工:流水線技術 102
5.3 匯編指令初探 102
5.3.1 匯編語言程序的第一行 102
5.3.2 這些指令是什么 105
5.4 匯編指令概況 106
5.4.1 ARM CPU家族 106
5.4.2 ARMv7-A處理器架構 107
5.4.3 ARMv7匯編指令介紹 109
5.5 ARM指令集架構 111
5.6 ARM手機芯片的現狀與格局 113
第6章 存儲金字塔與ARM匯編 115
6.1 ARM CPU的完整結構 115
6.2 存儲設備的金字塔結構 117
6.3 ARM芯片的緩存設計原理 119
6.3.1 緩存的基本理解 119
6.3.2 簡單的緩存映射結構:直接映射 121
6.3.3 靈活高效的緩存結構:組相聯映射 123
6.3.4 利用一個簡單的公式優化訪存性能 125
6.4 ARM匯編知識 126
6.4.1 ARM匯編數據類型和寄存器 127
6.4.2 ARM指令集 130
6.4.3 ARM匯編的內存操作 131
6.5 NEON匯編指令 133
6.5.1 NEON寄存器與指令類型 134
6.5.2 NEON存儲操作指令 135
6.5.3 NEON通用數據操作指令 137
6.5.4 NEON通用算術操作指令 138
6.5.5 NEON乘法指令 139
6.5.6 運用NEON指令計算矩陣乘法 140
第7章 移動端CPU預測性能優化 142
7.1 工具及體積優化 142
7.1.1 工具使用 143
7.1.2 模型體積優化 148
7.1.3 深度學習庫文件體積優化 149
7.2 CPU高性能通用優化 150
7.2.1 編譯選項優化 150
7.2.2 內存性能和耗電量優化 151
7.2.3 循環展開 153
7.2.4 并行優化與流水線重排 154
7.3 卷積性能優化方式 157
7.3.1 滑窗卷積和GEMM性能對比 157
7.3.2 基于Winograd算法進行卷積性能優化 160
7.3.3 快速傅里葉變換 162
7.3.4 卷積計算基本優化 163
7.4 開發問題與經驗總結 164
第8章 移動端GPU編程及深度學習框架落地實踐 166
8.1 異構計算編程框架OpenCL 166
8.1.1 開發移動端GPU應用程序 167
8.1.2 OpenCL中的一些概念 168
8.2 移動端視覺搜索研發 169
8.2.1 初次探索移動端AI能力 170
8.2.2 取消拍照按鈕,提升視覺搜索體驗 171
8.2.3 使用深度學習技術提速視覺搜索 172
8.2.4 通過AI工程技術提升視覺搜索體驗 174
8.3 解決歷史問題:研發Paddle-Lite框架 176
8.3.1 體積壓縮 178
8.3.2 工程結構編碼前重新設計 178
8.3.3 視覺搜索的高級形態:實時視頻流式搜索 184

讀者評論

0k000澳客网竞彩