第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
· · · · · · (
收起)