第一部分 元編程基礎技術
第1章 基本技巧 3
1.1 元函數與type_traits 3
1.1.1 元函數介紹 3
1.1.2 類型元函數 4
1.1.3 各式各樣的元函數 6
1.1.4 type_traits 7
1.1.5 元函數與宏 7
1.1.6 本書中元函數的命名方式 8
1.2 模闆型模闆參數與容器模闆 8
1.2.1 模闆作為元函數的輸入 9
1.2.2 模闆作為元函數的輸齣 9
1.2.3 容器模闆 10
1.3 順序、分支與循環代碼的編寫 12
1.3.1 順序執行的代碼 12
1.3.2 分支執行的代碼 13
1.3.3 循環執行的代碼 19
1.3.4 小心:實例化爆炸與編譯崩潰 21
1.3.5 分支選擇與短路邏輯 23
1.4 奇特的遞歸模闆式 24
1.5 小結 25
1.6 練習 26
第2章 異類詞典與policy模闆 28
2.1 具名參數簡介 28
2.2 異類詞典 30
2.2.1 模塊的使用方式 30
2.2.2 鍵的錶示 32
2.2.3 異類詞典的實現 34
2.2.4 VarTypeDict的性能簡析 41
2.2.5 用std::tuple作為緩存 41
2.3 policy模闆 42
2.3.1 policy介紹 42
2.3.2 定義policy與policy對象(模闆) 45
2.3.3 使用policy 47
2.3.4 背景知識:支配與虛繼承 49
2.3.5 policy對象與policy支配結構 50
2.3.6 policy選擇元函數 52
2.3.7 使用宏簡化policy對象的聲明 57
2.4 小結 58
2.5 練習 58
第二部分 深度學習框架
第3章 深度學習概述 63
3.1 深度學習簡介 63
3.1.1 從機器學習到深度學習 64
3.1.2 各式各樣的人工神經網絡 65
3.1.3 深度學習係統的組織與訓練 68
3.2 本書所實現的框架:MetaNN 70
3.2.1 從矩陣計算工具到深度學習框架 70
3.2.2 MetaNN介紹 71
3.2.3 本書將要討論的內容 72
3.2.4 本書不會涉及的主題 75
3.3 小結 75
第4章 類型體係與基本數據類型 76
4.1 類型體係 77
4.1.1 類型體係介紹 77
4.1.2 迭代器分類體係 78
4.1.3 將標簽作為模闆參數 80
4.1.4 MetaNN的類型體係 81
4.1.5 與類型體係相關的元函數 82
4.2 設計理念 84
4.2.1 支持不同的計算設備與計算單元 84
4.2.2 存儲空間的分配與維護 85
4.2.3 淺拷貝與寫操作檢測 88
4.2.4 底層接口擴展 89
4.2.5 類型轉換與求值 91
4.2.6 數據接口規範 92
4.3 標量 92
4.3.1 類模闆的聲明 93
4.3.2 基於CPU的特化版本 94
4.3.3 標量的主體類型 95
4.4 矩陣 96
4.4.1 Matrix類模闆 96
4.4.2 特殊矩陣:平凡矩陣、全零矩陣與獨熱嚮量 101
4.4.3 引入新的矩陣類 104
4.5 列錶 105
4.5.1 Batch模闆 105
4.5.2 Array模闆 108
4.5.3 重復與Duplicate模闆 113
4.6 小結 116
4.7 練習 116
第5章 運算與錶達式模闆 119
5.1 錶達式模闆簡介 119
5.2 MetaNN運算模闆的設計思想 122
5.2.1 Add模闆的問題 122
5.2.2 運算模闆的行為分析 122
5.3 運算分類 124
5.4 輔助模闆 125
5.4.1 輔助類模闆OperElementType_/OperDeviceType_ 125
5.4.2 輔助類模闆OperXXX_ 126
5.4.3 輔助類模闆OperCateCal 126
5.4.4 輔助類模闆OperOrganizer 128
5.4.5 輔助類模闆OperSeq 130
5.5 運算模闆的框架 131
5.5.1 運算模闆的類彆標簽 131
5.5.2 UnaryOp的定義 132
5.6 運算實現示例 133
5.6.1 Sigmoid運算 133
5.6.2 Add運算 136
5.6.3 轉置運算 139
5.6.4 摺疊運算 141
5.7 MetaNN已支持的運算列錶 141
5.7.1 一元運算 141
5.7.2 二元運算 142
5.7.3 三元運算 144
5.8 運算的摺衷與局限性 144
5.8.1 運算的摺衷 144
5.8.2 運算的局限性 145
5.9 小結 146
5.10 練習 146
第6章 基本層 148
6.1 層的設計理念 148
6.1.1 層的介紹 148
6.1.2 層對象的構造 150
6.1.3 參數矩陣的初始化與加載 151
6.1.4 正嚮傳播 152
6.1.5 存儲中間結果 154
6.1.6 反嚮傳播 154
6.1.7 參數矩陣的更新 155
6.1.8 參數矩陣的獲取 155
6.1.9 層的中性檢測 156
6.2 層的輔助邏輯 156
6.2.1 初始化模塊 156
6.2.2 DynamicData類模闆 161
6.2.3 層的常用policy對象 166
6.2.4 InjectPolicy元函數 168
6.2.5 通用I/O結構 168
6.2.6 通用操作函數 169
6.3 層的具體實現 170
6.3.1 AddLayer 170
6.3.2 ElementMulLayer 172
6.3.3 BiasLayer 176
6.4 MetaNN已實現的基本層 181
6.5 小結 183
6.6 練習 184
第7章 復閤層與循環層 185
7.1 復閤層的接口與設計理念 186
7.1.1 基本結構 186
7.1.2 結構描述語法 187
7.1.3 policy的繼承關係 188
7.1.4 policy的修正 189
7.1.5 復閤層的構造函數 190
7.1.6 一個完整的復閤層構造示例 190
7.2 policy繼承與修正邏輯的實現 191
7.2.1 policy繼承邏輯的實現 191
7.2.2 policy修正邏輯的實現 194
7.3 ComposeTopology的實現 195
7.3.1 功能介紹 195
7.3.2 拓撲排序算法介紹 195
7.3.3 ComposeTopology包含的主要步驟 196
7.3.4 結構描述子句與其劃分 196
7.3.5 結構閤法性檢查 198
7.3.6 拓撲排序的實現 200
7.3.7 子層實例化元函數 203
7.4 ComposeKernel的實現 207
7.4.1 類模闆的聲明 208
7.4.2 子層對象管理 208
7.4.3 參數獲取、梯度收集與中性檢測 211
7.4.4 參數初始化與加載 212
7.4.5 正嚮傳播 214
7.4.6 反嚮傳播 221
7.5 復閤層實現示例 221
7.6 循環層 222
7.6.1 GruStep 222
7.6.2 構建RecurrentLayer類模闆 224
7.6.3 RecurrentLayer的使用 230
7.7 小結 230
7.8 練習 230
第8章 求值與優化 233
8.1 MetaNN的求值模型 234
8.1.1 運算的層次結構 234
8.1.2 求值子係統的模塊劃分 235
8.2 基本求值邏輯 242
8.2.1 主體類型的求值接口 242
8.2.2 非主體基本數據類型的求值 243
8.2.3 運算模闆的求值 245
8.2.4 DyanmicData與求值 248
8.3 求值過程的優化 249
8.3.1 避免重復計算 249
8.3.2 同類計算閤並 250
8.3.3 多運算協同優化 251
8.4 小結 258
8.5 練習 259
後記—方傢休見笑,吾道本艱難 260
· · · · · · (
收起)