內容提要
《深度學習之TensorFlow工程化項目實戰》是一本非常全面的、專注於實戰的AI圖書,兼容TensorFlow 1.x和2.x版本,共75個實例。
《深度學習之TensorFlow工程化項目實戰》共分為5篇:第1篇,介紹了學習準備、搭建開發環境、使用AI模型來識別圖像;第2篇,介紹了用TensorFlow開發實際工程的一些基礎操作,包括使用TensorFlow製作自己的數據集、快速訓練自己的圖片分類模型、編寫訓練模型的程式;第3篇,介紹了機器學習算法相關內容,包括特徵工程、卷積神經網路(CNN)、循環神經網路(RNN);第4篇,介紹了多模型的組合訓練技術,包括生成式模型、模型的攻與防;第5篇,介紹了深度學習在工程上的套用,側重於提升讀者的工程能力,包括TensorFlow模型製作、布署TensorFlow模型、商業實例。
本書結構清晰、案例豐富、通俗易懂、實用性強。適合對人工智慧、TensorFlow感興趣的讀者作為自學教程。另外,本書也適合社會培訓學校作為培訓教材,還適合大中專院校的相關專業作為教學參考書。
目錄
第1篇 準備
第1章 學習準備 2
1.1 TensorFlow能做什麼 2
1.2 學習TensorFlow的必備知識 3
1.3 學習技巧:跟讀代碼 4
1.4 如何學習本書 4
第2章 搭建開發環境 5
2.1 準備硬體環境 5
2.2 下載及安裝Anaconda 6
2.3 安裝TensorFlow 9
2.4 GPU版本的安裝方法 10
2.4.1 在Windows中安裝CUDA 10
2.4.2 在Linux中安裝CUDA 13
2.4.3 在Windows中安裝cuDNN 13
2.4.4 在Linux中安裝cuDNN 14
2.4.5 常見錯誤及解決方案 16
2.5 測試顯示卡的常用命令 16
2.6 TensorFlow 1.x版本與2.x版本共存的解決方案 18
第3章 實例1:用AI模型識別圖像是桌子、貓、狗,還是其他 21
3.1 準備代碼環境並預訓練模型 21
3.2 代碼實現:初始化環境變數,並載入ImgNet標籤 24
3.3 代碼實現:定義網路結構 25
3.4 代碼實現:載入模型進行識別 26
3.5 擴展:用更多預訓練模型完成圖片分類任務 28
第2篇 基礎
第4章 用TensorFlow製作自己的數據集 30
4.1 快速導讀 30
4.1.1 什麼是數據集 30
4.1.2 TensorFlow的框架 31
4.1.3 什麼是TFDS 31
4.2 實例2:將模擬數據製作成記憶體對象數據集 32
4.2.1 代碼實現:生成模擬數據 32
4.2.2 代碼實現:定義占位符 33
4.2.3 代碼實現:建立會話,並獲取數據 34
4.2.4 代碼實現:將模擬數據可視化 34
4.2.5 運行程式 34
4.2.6 代碼實現:創建帶有疊代值並支持亂序功能的模擬數據集 35
4.3 實例3:將圖片製作成記憶體對象數據集 37
4.3.1 樣本介紹 38
4.3.2 代碼實現:載入檔案名稱稱與標籤 39
4.3.3 代碼實現:生成佇列中的批次樣本數據 40
4.3.4 代碼實現:在會話中使用數據集 41
4.3.5 運行程式 42
4.4 實例4:將Excel檔案製作成記憶體對象數據集 42
4.4.1 樣本介紹 43
4.4.2 代碼實現:逐行讀取數據並分離標籤 43
4.4.3 代碼實現:生成佇列中的批次樣本數據 44
4.4.4 代碼實現:在會話中使用數據集 45
4.4.5 運行程式 46
4.5 實例5:將圖片檔案製作成TFRecord數據集 46
4.5.1 樣本介紹 47
4.5.2 代碼實現:讀取樣本檔案的目錄及標籤 47
4.5.3 代碼實現:定義函式生成TFRecord數據集 48
4.5.4 代碼實現:讀取TFRecord數據集,並將其轉化為佇列 49
4.5.5 代碼實現:建立會話,將數據保存到檔案 50
4.5.6 運行程式 51
4.6 實例6:將記憶體對象製作成Dataset數據集 52
4.6.1 如何生成Dataset數據集 52
4.6.2 如何使用Dataset接口 53
4.6.3 tf.data.Dataset接口所支持的數據集變換操作 54
4.6.4 代碼實現:以元組和字典的方式生成Dataset對象 58
4.6.5 代碼實現:對Dataset對象中的樣本進行變換操作 59
4.6.6 代碼實現:創建Dataset疊代器 60
4.6.7 代碼實現:在會話中取出數據 60
4.6.8 運行程式 61
4.6.9 使用tf.data.Dataset.from_tensor_slices接口的注意事項 62
4.7 實例7:將圖片檔案製作成Dataset數據集 63
4.7.1 代碼實現:讀取樣本檔案的目錄及標籤 64
4.7.2 代碼實現:定義函式,實現圖片轉換操作 64
4.7.3 代碼實現:用自定義函式實現圖片歸一化 65
4.7.4 代碼實現:用第三方函式將圖片旋轉30° 65
4.7.5 代碼實現:定義函式,生成Dataset對象 66
4.7.6 代碼實現:建立會話,輸出數據 67
4.7.7 運行程式 68
4.8 實例8:將TFRecord檔案製作成Dataset數據集 69
4.8.1 樣本介紹 69
4.8.2 代碼實現:定義函式,生成Dataset對象 70
4.8.3 代碼實現:建立會話輸出數據 71
4.8.4 運行程式 72
4.9 實例9:在動態圖中讀取Dataset數據集 72
4.9.1 代碼實現:添加動態圖調用 72
4.9.2 製作數據集 73
4.9.3 代碼實現:在動態圖中顯示數據 73
4.9.4 實例10:在TensorFlow 2.x中運算元據集 74
4.10 實例11:在不同場景中使用數據集 77
4.10.1 代碼實現:在訓練場景中使用數據集 78
4.10.2 代碼實現:在套用模型場景中使用數據集 79
4.10.3 代碼實現:在訓練與測試混合場景中使用數據集 80
4.11 tf.data.Dataset接口的更多套用 81
第5章 10分鐘快速訓練自己的圖片分類模型 82
5.1 快速導讀 82
5.1.1 認識模型和模型檢查點檔案 82
5.1.2 了解“預訓練模型”與微調(Fine-Tune) 82
5.1.3 學習TensorFlow中的預訓練模型庫——TF-Hub庫 83
5.2 實例12:通過微調模型分辨男女 83
5.2.1 準備工作 84
5.2.2 代碼實現:處理樣本數據並生成Dataset對象 85
5.2.3 代碼實現:定義微調模型的類MyNASNetModel 88
5.2.4 代碼實現:構建MyNASNetModel類中的基本模型 88
5.2.5 代碼實現:實現MyNASNetModel類中的微調操作 89
5.2.6 代碼實現:實現與訓練相關的其他方法 90
5.2.7 代碼實現:構建模型,用於訓練、測試、使用 92
5.2.8 代碼實現:通過二次疊代來訓練微調模型 94
5.2.9 代碼實現:測試模型 96
5.3 擴展:通過攝像頭實時分辨男女 100
5.4 TF-slim接口中的更多成熟模型 100
5.5 實例13:用TF-Hub庫微調模型以評估人物的年齡 100
5.5.1 準備樣本 101
5.5.2 下載TF-Hub庫中的模型 102
5.5.3 代碼實現:測試TF-Hub庫中的MobileNet_V2模型 104
5.5.4 用TF-Hub庫微調MobileNet_V2模型 107
5.5.5 代碼實現:用模型評估人物的年齡 109
5.5.6 擴展:用TF-Hub庫中的其他模型處理不同領域的分類任務 113
5.6 總結 113
5.7 練習題 114
5.7.1 基於TF-slim接口的練習 115
5.7.2 基於TF-Hub庫的練習 115
第6章 用TensorFlow編寫訓練模型的程式 117
6.1 快速導讀 117
6.1.1 訓練模型是怎么一回事 117
6.1.2 用“靜態圖”方式訓練模型 117
6.1.3 用“動態圖”方式訓練模型 118
6.1.4 什麼是估算器框架接口(Estimators API) 119
6.1.5 什麼是tf.layers接口 120
6.1.6 什麼是tf.keras接口 121
6.1.7 什麼是tf.js接口 122
6.1.8 什麼是TFLearn框架 123
6.1.9 該選擇哪種框架 123
6.1.10 分配運算資源與使用分布策略 124
6.1.11 用tfdbg調試TensorFlow模型 127
6.1.12 用鉤子函式(Training_Hooks)跟蹤訓練狀態 127
6.1.13 用分散式運行方式訓練模型 128
6.1.14 用T2T框架系統更方便地訓練模型 128
6.1.15 將TensorFlow 1.x中的代碼移植到2.x版本 129
6.1.16 TensorFlow 2.x中的新特性——自動圖 130
6.2 實例14:用靜態圖訓練一個具有保存檢查點功能的回歸模型 131
6.2.1 準備開發步驟 131
6.2.2 生成檢查點檔案 131
6.2.3 載入檢查點檔案 132
6.2.4 代碼實現:線上性回歸模型中加入保存檢查點功能 132
6.2.5 修改疊代次數,二次訓練 135
6.3 實例15:用動態圖(eager)訓練一個具有保存檢查點功能的回歸模型 136
6.3.1 代碼實現:啟動動態圖,生成模擬數據 136
6.3.2 代碼實現:定義動態圖的網路結構 137
6.3.3 代碼實現:在動態圖中加入保存檢查點功能 138
6.3.4 代碼實現:按指定疊代次數進行訓練,並可視化結果 139
6.3.5 運行程式,顯示結果 140
6.3.6 代碼實現:用另一種方法計算動態圖梯度 141
6.3.7 實例16:在動態圖中獲取參數變數 142
6.3.8 小心動態圖中的參數陷阱 144
6.3.9 實例17:在靜態圖中使用動態圖 145
6.4 實例18:用估算器框架訓練一個回歸模型 147
6.4.1 代碼實現:生成樣本數據集 147
6.4.2 代碼實現:設定日誌級別 148
6.4.3 代碼實現:實現估算器的輸入函式 148
6.4.4 代碼實現:定義估算器的模型函式 149
6.4.5 代碼實現:通過創建config檔案指定硬體的運算資源 151
6.4.6 代碼實現:定義估算器 152
6.4.7 用tf.estimator.RunConfig控制更多的訓練細節 153
6.4.8 代碼實現:用估算器訓練模型 153
6.4.9 代碼實現:通過熱啟動實現模型微調 155
6.4.10 代碼實現:測試估算器模型 158
6.4.11 代碼實現:使用估算器模型 158
6.4.12 實例19:為估算器添加日誌鉤子函式 159
6.5 實例20:將估算器代碼改寫成靜態圖代碼 161
6.5.1 代碼實現:複製網路結構 161
6.5.2 代碼實現:重用輸入函式 163
6.5.3 代碼實現:創建會話恢復模型 163
6.5.4 代碼實現:繼續訓練 163
6.6 實例21:用tf.layers API在動態圖上識別手寫數字 165
6.6.1 代碼實現:啟動動態圖並載入手寫圖片數據集 165
6.6.2 代碼實現:定義模型的類 166
6.6.3 代碼實現:定義網路的反向傳播 167
6.6.4 代碼實現:訓練模型 167
6.7 實例22:用tf.keras API訓練一個回歸模型 168
6.7.1 代碼實現:用model類搭建模型 168
6.7.2 代碼實現:用sequential類搭建模型 169
6.7.3 代碼實現:搭建反向傳播的模型 171
6.7.4 代碼實現:用兩種方法訓練模型 172
6.7.5 代碼實現:獲取模型參數 172
6.7.6 代碼實現:測試模型與用模型進行預測 173
6.7.7 代碼實現:保存模型與載入模型 173
6.7.8 代碼實現:將模型導出成JSON檔案,再將JSON檔案導入模型 175
6.7.9 實例23:在tf.keras接口中使用預訓練模型ResNet 176
6.7.10 擴展:在動態圖中使用tf.keras接口 178
6.7.11 實例24:在靜態圖中使用tf.keras接口 178
6.8 實例25:用tf.js接口後方訓練一個回歸模型 180
6.8.1 代碼實現:在HTTP的頭標籤中添加tfjs模組 180
6.8.2 代碼實現:用JavaScript腳本實現回歸模型 181
6.8.3 運行程式:在瀏覽器中查看效果 181
6.8.4 擴展:tf.js 接口的套用場景 182
6.9 實例26:用估算器框架實現分散式部署訓練 182
6.9.1 運行程式:修改估算器模型,使其支持分散式 182
6.9.2 通過TF_CONFIG進行分散式配置 183
6.9.3 運行程式 185
6.9.4 擴展:用分布策略或KubeFlow框架進行分散式部署 186
6.10 實例27:在分散式估算器框架中用tf.keras接口訓練ResNet模型,識別圖片中是橘子還是蘋果 186
6.10.1 樣本準備 186
6.10.2 代碼實現:準備訓練與測試數據集 187
6.10.3 代碼實現:製作模型輸入函式 187
6.10.4 代碼實現:搭建ResNet模型 188
6.10.5 代碼實現:訓練分類器模型 189
6.10.6 運行程式:評估模型 190
6.10.7 擴展:全連線網路的最佳化 190
6.11 實例28:在T2T框架中用tf.layers接口實現MNIST數據集分類 191
6.11.1 代碼實現:查看T2T框架中的數據集(problems) 191
6.11.2 代碼實現:構建T2T框架的工作路徑及下載數據集 192
6.11.3 代碼實現:在T2T框架中搭建自定義卷積網路模型 193
6.11.4 代碼實現:用動態圖方式訓練自定義模型 194
6.11.5 代碼實現:在動態圖中用metrics模組評估模型 195
6.12 實例29:在T2T框架中,用自定義數據集訓練中英文翻譯模型 196
6.12.1 代碼實現:聲明自己的problems數據集 196
6.12.2 代碼實現:定義自己的problems數據集 197
6.12.3 在命令行下生成TFrecoder格式的數據 198
6.12.4 查找T2T框架中的模型及超參,並用指定的模型及超參進行訓練 199
6.12.5 用訓練好的T2T框架模型進行預測 201
6.12.6 擴展:在T2T框架中,如何選取合適的模型及超參 202
6.13 實例30:將TensorFlow 1.x中的代碼升級為可用於2.x版本的代碼 203
6.13.1 準備工作:創建Python虛環境 203
6.13.2 使用工具轉換源碼 204
6.13.3 修改轉換後的代碼檔案 204
6.13.4 將代碼升級到TensorFlow 2.x版本的經驗總結 205
第3篇 進階
第7章 特徵工程——會說話的數據 208
7.1 快速導讀 208
7.1.1 特徵工程的基礎知識 208
7.1.2 離散數據特徵與連續數據特徵 209
7.1.3 了解特徵列接口 210
7.1.4 了解序列特徵列接口 210
7.1.5 了解弱學習器接口——梯度提升樹(TFBT接口) 210
7.1.6 了解特徵預處理模組(tf.Transform) 211
7.1.7 了解因子分解模組 212
7.1.8 了解加權矩陣分解算法 212
7.1.9 了解Lattice模組——點陣模型 213
7.1.10 聯合訓練與集成學習 214
7.2 實例31:用wide_deep模型預測人口收入 214
7.2.1 了解人口收入數據集 214
7.2.2 代碼實現:探索性數據分析 217
7.2.3 認識wide_deep模型 218
7.2.4 部署代碼檔案 219
7.2.5 代碼實現:初始化樣本常量 220
7.2.6 代碼實現:生成特徵列 220
7.2.7 代碼實現:生成估算器模型 222
7.2.8 代碼實現:定義輸入函式 223
7.2.9 代碼實現:定義用於導出凍結圖檔案的函式 224
7.2.10 代碼實現:定義類,解析啟動參數 225
7.2.11 代碼實現:訓練和測試模型 226
7.2.12 代碼實現:使用模型 227
7.2.13 運行程式 228
7.3 實例32:用弱學習器中的梯度提升樹算法預測人口收入 229
7.3.1 代碼實現:為梯度提升樹模型準備特徵列 230
7.3.2 代碼實現:構建梯度提升樹模型 230
7.3.3 代碼實現:訓練並導出梯度提升樹模型 231
7.3.4 代碼實現:設定啟動參數,運行程式 232
7.3.5 擴展:更靈活的TFBT接口 233
7.4 實例33:用feature_column模組轉換特徵列 233
7.4.1 代碼實現:用feature_column模組處理連續值特徵列 234
7.4.2 代碼實現:將連續值特徵列轉化成離散值特徵列 237
7.4.3 代碼實現:將離散文本特徵列轉化為one-hot與詞向量 239
7.4.4 代碼實現:根據特徵列生成交叉列 246
7.5 實例34:用sequence_feature_column接口完成自然語言處理任務的數據預處理工作 248
7.5.1 代碼實現:構建模擬數據 248
7.5.2 代碼實現:構建詞嵌入初始值 249
7.5.3 代碼實現:構建詞嵌入特徵列與共享特徵列 249
7.5.4 代碼實現:構建序列特徵列的輸入層 250
7.5.5 代碼實現:建立會話輸出結果 251
7.6 實例35:用factorization模組的kmeans接口聚類COCO數據集中的標註框 253
7.6.1 代碼實現:設定要使用的數據集 253
7.6.2 代碼實現:準備帶聚類的數據樣本 253
7.6.3 代碼實現:定義聚類模型 255
7.6.4 代碼實現:訓練模型 256
7.6.5 代碼實現:輸出圖示化結果 256
7.6.6 代碼實現:提取並排序聚類結果 258
7.6.7 擴展:聚類與神經網路混合訓練 258
7.7 實例36:用加權矩陣分解模型實現基於電影評分的推薦系統 259
7.7.1 下載並載入數據集 259
7.7.2 代碼實現:根據用戶和電影特徵列生成稀疏矩陣 260
7.7.3 代碼實現:建立WALS模型,並對其進行訓練 261
7.7.4 代碼實現:評估WALS模型 263
7.7.5 代碼實現:用WALS模型為用戶推薦電影 264
7.7.6 擴展:使用WALS的估算器接口 265
7.8 實例37:用Lattice模組預測人口收入 265
7.8.1 代碼實現:讀取樣本,並創建輸入函式 266
7.8.2 代碼實現:創建特徵列,並保存校準關鍵點 267
7.8.3 代碼實現:創建校準線性模型 270
7.8.4 代碼實現:創建校準點陣模型 270
7.8.5 代碼實現:創建隨機微點陣模型 271
7.8.6 代碼實現:創建集合的微點陣模型 271
7.8.7 代碼實現:定義評估與訓練函式 272
7.8.8 代碼實現:訓練並評估模型 273
7.8.9 擴展:將點陣模型嵌入神經網路中 274
7.9 實例38:結合知識圖譜實現基於電影的推薦系統 278
7.9.1 準備數據集 278
7.9.2 預處理數據 279
7.9.3 搭建MKR模型 279
7.9.4 訓練模型並輸出結果 286
7.10 可解釋性算法的意義 286
第8章 卷積神經網路(CNN)——在圖像處理中套用最廣泛的模型 287
8.1 快速導讀 287
8.1.1 認識卷積神經網路 287
8.1.2 什麼是空洞卷積 288
8.1.3 什麼是深度卷積 290
8.1.4 什麼是深度可分離卷積 290
8.1.5 了解卷積網路的缺陷及補救方法 291
8.1.6 了解膠囊神經網路與動態路由 292
8.1.7 了解矩陣膠囊網路與EM路由算法 297
8.1.8 什麼是NLP任務 298
8.1.9 了解多頭注意力機制與內部注意力機制 298
8.1.10 什麼是帶有位置向量的詞嵌入 300
8.1.11 什麼是目標檢測任務 300
8.1.12 什麼是目標檢測中的上採樣與下採樣 301
8.1.13 什麼是圖片分割任務 301
8.2 實例39:用膠囊網路識別黑白圖中服裝的圖案 302
8.2.1 熟悉樣本:了解Fashion-MNIST數據集 302
8.2.2 下載Fashion-MNIST數據集 303
8.2.3 代碼實現:讀取及顯示Fashion-MNIST數據集中的數據 304
8.2.4 代碼實現:定義膠囊網路模型類CapsuleNetModel 305
8.2.5 代碼實現:實現膠囊網路的基本結構 306
8.2.6 代碼實現:構建膠囊網路模型 309
8.2.7 代碼實現:載入數據集,並訓練膠囊網路模型 310
8.2.8 代碼實現:建立會話訓練模型 311
8.2.9 運行程式 313
8.2.10 實例40:實現帶有EM路由的膠囊網路 314
8.3 實例41:用TextCNN模型分析評論者是否滿意 322
8.3.1 熟悉樣本:了解電影評論數據集 322
8.3.2 熟悉模型:了解TextCNN模型 322
8.3.3 數據預處理:用preprocessing接口製作字典 323
8.3.4 代碼實現:生成NLP文本數據集 326
8.3.5 代碼實現:定義TextCNN模型 327
8.3.6 代碼實現:訓練TextCNN模型 330
8.3.7 運行程式 332
8.3.8 擴展:提升模型精度的其他方法 333
8.4 實例42:用帶注意力機制的模型分析評論者是否滿意 333
8.4.1 熟悉樣本:了解tf.keras接口中的電影評論數據集 333
8.4.2 代碼實現:將tf.keras接口中的IMDB數據集還原成句子 334
8.4.3 代碼實現:用tf.keras接口開發帶有位置向量的詞嵌入層 336
8.4.4 代碼實現:用tf.keras接口開發注意力層 338
8.4.5 代碼實現:用tf.keras接口訓練模型 340
8.4.6 運行程式 341
8.4.7 擴展:用Targeted Dropout技術進一步提升模型的性能 342
8.5 實例43:搭建YOLO V3模型,識別圖片中的酒杯、水果等物體 343
8.5.1 YOLO V3模型的樣本與結構 343
8.5.2 代碼實現:Darknet-53 模型的darknet塊 344
8.5.3 代碼實現:Darknet-53 模型的下採樣卷積 345
8.5.4 代碼實現:搭建Darknet-53模型,並返回3種尺度特徵值 345
8.5.5 代碼實現:定義YOLO檢測模組的參數及候選框 346
8.5.6 代碼實現:定義YOLO檢測塊,進行多尺度特徵融合 347
8.5.7 代碼實現:將YOLO檢測塊的特徵轉化為bbox attrs單元 347
8.5.8 代碼實現:實現YOLO V3的檢測部分 349
8.5.9 代碼實現:用非極大值抑制算法對檢測結果去重 352
8.5.10 代碼實現:載入預訓練權重 355
8.5.11 代碼實現:載入圖片,進行目標實物的識別 356
8.5.12 運行程式 358
8.6 實例44:用YOLO V3模型識別門牌號 359
8.6.1 工程部署:準備樣本 359
8.6.2 代碼實現:讀取樣本數據,並製作標籤 359
8.6.3 代碼實現:用tf.keras接口構建YOLO V3模型,並計算損失 364
8.6.4 代碼實現:在動態圖中訓練模型 368
8.6.5 代碼實現:用模型識別門牌號 372
8.6.6 擴展:標註自己的樣本 374
8.7 實例45:用Mask R-CNN模型定位物體的像素點 375
8.7.1 下載COCO數據集及安裝pycocotools 376
8.7.2 代碼實現:驗證pycocotools及讀取COCO數據集 377
8.7.3 拆分Mask R-CNN模型的處理步驟 383
8.7.4 工程部署:準備代碼檔案及模型 385
8.7.5 代碼實現:載入數據構建模型,並輸出模型權重 385
8.7.6 代碼實現:搭建殘差網路ResNet 387
8.7.7 代碼實現:搭建Mask R-CNN模型的骨幹網路ResNet 393
8.7.8 代碼實現:可視化Mask R-CNN模型骨幹網路的特徵輸出 396
8.7.9 代碼實現:用特徵金字塔網路處理骨幹網路特徵 400
8.7.10 計算RPN中的錨點 402
8.7.11 代碼實現:構建RPN 403
8.7.12 代碼實現:用非極大值抑制算法處理RPN的結果 405
8.7.13 代碼實現:提取RPN的檢測結果 410
8.7.14 代碼實現:可視化RPN的檢測結果 412
8.7.15 代碼實現:在MaskRCNN類中對ROI區域進行分類 415
8.7.16 代碼實現:金字塔網路的區域對齊層(ROIAlign)中的區域框與特徵的匹配算法 416
8.7.17 代碼實現:在金字塔網路的ROIAlign層中按區域框線提取內容 418
8.7.18 代碼實現:調試並輸出ROIAlign層的內部運算值 421
8.7.19 代碼實現:對ROI內容進行分類 422
8.7.20 代碼實現:用檢測器DetectionLayer檢測ROI內容,得到最終的實物矩形 426
8.7.21 代碼實現:根據ROI內容進行實物像素分割 432
8.7.22 代碼實現:用Mask R-CNN模型分析圖片 436
8.8 實例46:訓練Mask R-CNN模型,進行形狀的識別 439
8.8.1 工程部署:準備代碼檔案及模型 440
8.8.2 樣本準備:生成隨機形狀圖片 440
8.8.3 代碼實現:為Mask R-CNN模型添加損失函式 442
8.8.4 代碼實現:為Mask R-CNN模型添加訓練函式,使其支持微調與全網訓練 444
8.8.5 代碼實現:訓練並使用模型 446
8.8.6 擴展:替換特徵提取網路 449
第9章 循環神經網路(RNN)——處理序列樣本的神經網路 450
9.1 快速導讀 450
9.1.1 什麼是循環神經網路 450
9.1.2 了解RNN模型的基礎單元LSTM與GRU 451
9.1.3 認識QRNN單元 451
9.1.4 認識SRU單元 451
9.1.5 認識IndRNN單元 452
9.1.6 認識JANET單元 453
9.1.7 最佳化RNN模型的技巧 453
9.1.8 了解RNN模型中多項式分布的套用 453
9.1.9 了解注意力機制的Seq2Seq框架 454
9.1.10 了解BahdanauAttention與LuongAttention 456
9.1.11 了解單調注意力機制 457
9.1.12 了解混合注意力機制 458
9.1.13 了解Seq2Seq接口中的採樣接口(Helper) 460
9.1.14 了解RNN模型的Wrapper接口 460
9.1.15 什麼是時間序列(TFTS)框架 461
9.1.16 什麼是梅爾標度 461
9.1.17 什麼是短時傅立葉變換 462
9.2 實例47:搭建RNN模型,為女孩生成英文名字 463
9.2.1 代碼實現:讀取及處理樣本 463
9.2.2 代碼實現:構建Dataset數據集 466
9.2.3 代碼實現:用tf.keras接口構建生成式RNN模型 467
9.2.4 代碼實現:在動態圖中訓練模型 468
9.2.5 代碼實現:載入檢查點檔案並用模型生成名字 469
9.2.6 擴展:用RNN模型編寫文章 471
9.3 實例48:用帶注意力機制的Seq2Seq模型為圖片添加內容描述 471
9.3.1 設計基於圖片的Seq2Seq 471
9.3.2 代碼實現:圖片預處理——用ResNet提取圖片特徵並保存 472
9.3.3 代碼實現:文本預處理——過濾處理、字典建立、對齊與向量化處理 475
9.3.4 代碼實現:創建數據集 477
9.3.5 代碼實現:用tf.keras接口構建Seq2Seq模型中的編碼器 477
9.3.6 代碼實現:用tf.keras接口構建Bahdanau類型的注意力機制 478
9.3.7 代碼實現:搭建Seq2Seq模型中的解碼器Decoder 478
9.3.8 代碼實現:在動態圖中計算Seq2Seq模型的梯度 480
9.3.9 代碼實現:在動態圖中為Seq2Seq模型添加保存檢查點功能 480
9.3.10 代碼實現:在動態圖中訓練Seq2Seq模型 481
9.3.11 代碼實現:用多項式分布採樣獲取圖片的內容描述 482
9.4 實例49:用IndRNN與IndyLSTM單元製作聊天機器人 485
9.4.1 下載及處理樣本 486
9.4.2 代碼實現:讀取樣本,分詞並創建字典 487
9.4.3 代碼實現:對樣本進行向量化、對齊、填充預處理 489
9.4.4 代碼實現:在Seq2Seq模型中加工樣本 489
9.4.5 代碼實現:在Seq2Seq模型中,實現基於IndRNN與IndyLSTM的
動態多層RNN編碼器 491
9.4.6 代碼實現:為Seq2Seq模型中的解碼器創建Helper 491
9.4.7 代碼實現:實現帶有Bahdanau注意力、dropout、OutputProjectionWrapper的解碼器 492
9.4.8 代碼實現:在Seq2Seq模型中實現反向最佳化 493
9.4.9 代碼實現:創建帶有鉤子函式的估算器,並進行訓練 494
9.4.10 代碼實現:用估算器框架評估模型 496
9.4.11 擴展:用注意力機制的Seq2Seq模型實現中英翻譯 498
9.5 實例50:預測飛機發動機的剩餘使用壽命 498
9.5.1 準備樣本 499
9.5.2 代碼實現:預處理數據——製作數據集的輸入樣本與標籤 500
9.5.3 代碼實現:構建帶有JANET單元的多層動態RNN模型 504
9.5.4 代碼實現:訓練並測試模型 505
9.5.5 運行程式 507
9.5.6 擴展:為含有JANET單元的RNN模型添加注意力機制 508
9.6 實例51:將動態路由用於RNN模型,對路透社新聞進行分類 509
9.6.1 準備樣本 509
9.6.2 代碼實現:預處理數據——對齊序列數據並計算長度 510
9.6.3 代碼實現:定義數據集 510
9.6.4 代碼實現:用動態路由算法聚合信息 511
9.6.5 代碼實現:用IndyLSTM單元搭建RNN模型 513
9.6.6 代碼實現:建立會話,訓練網路 514
9.6.7 擴展:用分級網路將文章(長文本數據)分類 515
9.7 實例52:用TFTS框架預測某地區每天的出生人數 515
9.7.1 準備樣本 515
9.7.2 代碼實現:數據預處理——製作TFTS框架中的讀取器 515
9.7.3 代碼實現:用TFTS框架定義模型,並進行訓練 516
9.7.4 代碼實現:用TFTS框架評估模型 517
9.7.5 代碼實現:用模型進行預測,並將結果可視化 517
9.7.6 運行程式 518
9.7.7 擴展:用TFTS框架進行異常值檢測 519
9.8 實例53:用Tacotron模型合成中文語音(TTS) 520
9.8.1 準備安裝包及樣本數據 520
9.8.2 代碼實現:將音頻數據分幀並轉為梅爾頻譜 521
9.8.3 代碼實現:用多進程預處理樣本並保存結果 523
9.8.4 拆分Tacotron網路模型的結構 525
9.8.5 代碼實現:搭建CBHG網路 527
9.8.6 代碼實現:構建帶有混合注意力機制的模組 529
9.8.7 代碼實現:構建自定義wrapper 531
9.8.8 代碼實現:構建自定義採樣器 534
9.8.9 代碼實現:構建自定義解碼器 537
9.8.10 代碼實現:構建輸入數據集 539
9.8.11 代碼實現:構建Tacotron網路 542
9.8.12 代碼實現:構建Tacotron網路模型的訓練部分 545
9.8.13 代碼實現:訓練模型併合成音頻檔案 546
9.8.14 擴展:用pypinyin模組實現文字到聲音的轉換 551
第4篇 高級
第10章 生成式模型——能夠輸出內容的模型 554
10.1 快速導讀 554
10.1.1 什麼是自編碼網路模型 554
10.1.2 什麼是對抗神經網路模型 554
10.1.3 自編碼網路模型與對抗神經網路模型的關係 555
10.1.4 什麼是批量歸一化中的自適應模式 555
10.1.5 什麼是實例歸一化 556
10.1.6 了解SwitchableNorm及更多的歸一化方法 556
10.1.7 什麼是圖像風格轉換任務 557
10.1.8 什麼是人臉屬性編輯任務 558
10.1.9 什麼是TFgan框架 558
10.2 實例54:構建DeblurGAN模型,將模糊相片變清晰 559
10.2.1 獲取樣本 559
10.2.2 準備SwitchableNorm算法模組 560
10.2.3 代碼實現:構建DeblurGAN中的生成器模型 560
10.2.4 代碼實現:構建DeblurGAN中的判別器模型 562
10.2.5 代碼實現:搭建DeblurGAN的完整結構 563
10.2.6 代碼實現:引入庫檔案,定義模型參數 563
10.2.7 代碼實現:定義數據集,構建正反向模型 564
10.2.8 代碼實現:計算特徵空間損失,並將其編譯到生成器模型的訓練模型中 566
10.2.9 代碼實現:按指定次數訓練模型 568
10.2.10 代碼實現:用模型將模糊相片變清晰 569
10.2.11 練習題 572
10.2.12 擴展:DeblurGAN模型的更多妙用 572
10.3 實例55:構建AttGAN模型,對照片進行加鬍子、加頭簾、加眼鏡、變年輕等修改 573
10.3.1 獲取樣本 573
10.3.2 了解AttGAN模型的結構 574
10.3.3 代碼實現:實現支持動態圖和靜態圖的數據集工具類 575
10.3.4 代碼實現:將CelebA做成數據集 577
10.3.5 代碼實現:構建AttGAN模型的編碼器 581
10.3.6 代碼實現:構建含有轉置卷積的解碼器模型 582
10.3.7 代碼實現:構建AttGAN模型的判別器模型部分 584
10.3.8 代碼實現:定義模型參數,並構建AttGAN模型 585
10.3.9 代碼實現:定義訓練參數,搭建正反向模型 587
10.3.10 代碼實現:訓練模型 592
10.3.11 實例56:為人臉添加不同的眼鏡 595
10.3.12 擴展:AttGAN模型的局限性 597
10.4 實例57:用RNN.WGAN模型模擬生成惡意請求 597
10.4.1 獲取樣本:通過Panabit設備獲取惡意請求樣本 597
10.4.2 了解RNN.WGAN模型 600
10.4.3 代碼實現:構建RNN.WGAN模型 601
10.4.4 代碼實現:訓練指定長度的RNN.WGAN模型 607
10.4.5 代碼實現:用長度依次遞增的方式訓練模型 612
10.4.6 運行代碼 613
10.4.7 擴展:模型的使用及最佳化 614
第11章 模型的攻與防——看似智慧型的AI也有脆弱的一面 616
11.1 快速導讀 616
11.1.1 什麼是FGSM方法 616
11.1.2 什麼是cleverhans模組 616
11.1.3 什麼是黑箱攻擊 617
11.1.4 什麼是基於雅可比矩陣的數據增強方法 618
11.1.5 什麼是數據中毒攻擊 620
11.2 實例58:用FGSM方法生成樣本,並攻擊PNASNet模型,讓其將“狗”識別成“盤子” 621
11.2.1 代碼實現:創建PNASNet模型 621
11.2.2 代碼實現:搭建輸入層並載入圖片,復現PNASNet模型的預測效果 623
11.2.3 代碼實現:調整參數,定義圖片的變化範圍 624
11.2.4 代碼實現:用梯度下降方式生成對抗樣本 625
11.2.5 代碼實現:用生成的樣本攻擊模型 626
11.2.6 擴展:如何防範攻擊模型的行為 627
11.2.7 代碼實現:將數據增強方式用在使用場景,以加固PNASNet模型,防範攻擊 627
11.3 實例59:擊破數據增強防護,製作抗旋轉對抗樣本 629
11.3.1 代碼實現:對輸入的數據進行多次旋轉 629
11.3.2 代碼實現:生成並保存魯棒性更好的對抗樣本 630
11.3.3 代碼實現:在PNASNet模型中比較對抗樣本的效果 631
11.4 實例60:以黑箱方式攻擊未知模型 633
11.4.1 準備工程代碼 633
11.4.2 代碼實現:搭建通用模型框架 634
11.4.3 代碼實現:搭建被攻擊模型 637
11.4.4 代碼實現:訓練被攻擊模型 638
11.4.5 代碼實現:搭建替代模型 639
11.4.6 代碼實現:訓練替代模型 639
11.4.7 代碼實現:黑箱攻擊目標模型 641
11.4.8 擴展:利用黑箱攻擊中的對抗樣本加固模型 645
第5篇 實戰——深度學習實際套用
第12章 TensorFlow模型製作——一種功能,多種身份 648
12.1 快速導讀 648
12.1.1 詳細分析檢查點檔案 648
12.1.2 什麼是模型中的凍結圖 649
12.1.3 什麼是TF Serving模組與saved_model模組 649
12.1.4 用編譯子圖(defun)提升動態圖的執行效率 649
12.1.5 什麼是TF_Lite模組 652
12.1.6 什麼是TFjs-converter模組 653
12.2 實例61:在源碼與檢查點檔案分離的情況下,對模型進行二次訓練 653
12.2.1 代碼實現:線上性回歸模型中,向檢查點檔案中添加指定節點 654
12.2.2 代碼實現:在脫離源碼的情況下,用檢查點檔案進行二次訓練 657
12.2.3 擴展:更通用的二次訓練方法 659
12.3 實例62:導出/導入凍結圖檔案 661
12.3.1 熟悉TensorFlow中的freeze_graph工具腳本 661
12.3.2 代碼實現:從線性回歸模型中導出凍結圖檔案 662
12.3.3 代碼實現:導入凍結圖檔案,並用模型進行預測 664
12.4 實例63:逆向分析凍結圖檔案 665
12.4.1 使用import_to_tensorboard工具 666
12.4.2 用TensorBoard工具查看模型結構 666
12.5 實例64:用saved_model模組導出與導入模型檔案 668
12.5.1 代碼實現:用saved_model模組導出模型檔案 668
12.5.2 代碼實現:用saved_model模組導入模型檔案 669
12.5.3 擴展:用saved_model模組導出帶有簽名的模型檔案 670
12.6 實例65:用saved_model_cli工具查看及使用saved_model模型 672
12.6.1 用show參數查看模型 672
12.6.2 用run參數運行模型 673
12.6.3 擴展:了解scan參數的黑名單機制 674
12.7 實例66:用TF-Hub庫導入、導出詞嵌入模型檔案 674
12.7.1 代碼實現:模擬生成通用詞嵌入模型 674
12.7.2 代碼實現:用TF-Hub庫導出詞嵌入模型 675
12.7.3 代碼實現:導出TF-Hub模型 678
12.7.4 代碼實現:用TF-Hub庫導入並使用詞嵌入模型 680
第13章 部署TensorFlow模型——模型與項目的深度結合 681
13.1 快速導讀 681
13.1.1 什麼是gRPC服務與HTTP/REST API 681
13.1.2 了解TensorFlow對移動終端的支持 682
13.1.3 了解樹莓派上的人工智慧 683
13.2 實例67:用TF_Serving部署模型並進行遠程使用 684
13.2.1 在Linux系統中安裝TF_Serving 684
13.2.2 在多平台中用Docker安裝TF_Serving 685
13.2.3 編寫代碼:固定模型的簽名信息 686
13.2.4 在Linux中開啟TF_Serving服務 688
13.2.5 編寫代碼:用gRPC訪問遠程TF_Serving服務 689
13.2.6 用HTTP/REST API訪問遠程TF_Serving服務 691
13.2.7 擴展:關於TF_Serving的更多例子 694
13.3 實例68:在安卓手機上識別男女 694
13.3.1 準備工程代碼 694
13.3.2 微調預訓練模型 695
13.3.3 搭建安卓開發環境 698
13.3.4 製作lite模型檔案 701
13.3.5 修改分類器代碼,並運行App 702
13.4 實例69:在iPhone手機上識別男女並進行活體檢測 703
13.4.1 搭建iOS開發環境 703
13.4.2 部署工程代碼並編譯 704
13.4.3 載入Lite模型,實現識別男女功能 706
13.4.4 代碼實現:調用攝像頭並採集視頻流 707
13.4.5 代碼實現:提取人臉特徵 710
13.4.6 活體檢測算法介紹 712
13.4.7 代碼實現:實現活體檢測算法 713
13.4.8 代碼實現:完成整體功能並運行程式 714
13.5 實例70:在樹莓派上搭建一個目標檢測器 717
13.5.1 安裝樹莓派系統 718
13.5.2 在樹莓派上安裝TensorFlow 721
13.5.3 編譯並安裝Protobuf 725
13.5.4 安裝OpenCV 726
13.5.5 下載目標檢測模型SSDLite 726
13.5.6 代碼實現:用SSDLite 模型進行目標檢測 727
第14章 商業實例——科技源於生活,用於生活 730
14.1 實例71:將特徵匹配技術套用在商標識別領域 730
14.1.1 項目背景 730
14.1.2 技術方案 730
14.1.3 預處理圖片——統一尺寸 731
14.1.4 用自編碼網路加夾角餘弦實現商標識別 731
14.1.5 用卷積網路加triplet-loss提升特徵提取效果 731
14.1.6 進一步的最佳化空間 732
14.2 實例72:用RNN抓取蠕蟲病毒 732
14.2.1 項目背景 733
14.2.2 判斷是否惡意域名不能只靠域名 733
14.2.3 如何識別惡意域名 733
14.3 實例73:迎賓機器人的技術關注點——體驗優先 734
14.3.1 迎賓機器人的產品背景 734
14.3.2 迎賓機器人的實現方案 734
14.3.3 迎賓機器人的同類產品 736
14.4 實例74:基於攝像頭的路邊停車場項目 737
14.4.1 項目背景 737
14.4.2 技術方案 738
14.4.3 方案缺陷 738
14.4.4 工程化補救方案 738
14.5 實例75:智慧型冰櫃產品——硬體成本之痛 739
14.5.1 智慧型冰櫃系列的產品背景 739
14.5.2 智慧型冰櫃的技術基礎 740
14.5.3 真實的非功能性需求——低成本 740
14.5.4 未來的技術趨勢及應對策略 741
作者簡介
本書由李金洪主筆編寫,參與本書編寫的還有以下作者。
石昌帥
代碼醫生工作室成員,具有豐富的嵌入式及算法開發經驗,參與多款機器人、圖像識別等項目開發,擅長機器人定位、導航技術、計算機視覺技術,熟悉NVIDIA jetson系列、Raspberry PI系列等平台軟硬體開發、算法最佳化。從事的技術方向包括機器人導航、圖像處理、自動駕駛等。
甘月
代碼醫生工作室成員,資深iOS高級工程師,有豐富的iOS研發經驗,先後擔任iOS主管、項目經理、iOS技術總監等職務,精通Objective-C、Swift、C等程式語言,參與過銀行金融、娛樂機器人、婚慶、醫療等領域的多個項目。擅長Mac系統下的AI技術開發。
江梟宇
代碼醫生工作室成員,是大蛇智慧型社區成長最快的AI學者。半年時間,由普通讀者升級為社區的資深輔導員。在校期間曾參加過電子設計大賽(獲省級一等獎)、Google校企合作的AI創新項目、省級創新訓練AI項目。熟悉Python、C和Java等程式語言。擅長圖像處理方向、特徵工程方向及語義壓縮方向的AI任務。