● 章基本技巧3
函數與type_traits3
1.函數介紹3
1.1.函數4
1.1.3各式函數6
1.1.4type_traits7
1.函數與宏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.4VarTypeDict的性能簡析41
2.2.5用std::tuple作為緩存41
2.3policy模板42
2.3.1policy介紹42
2.3.2定義policy與policy對像(模板)45
2.3.3使用policy47
2.3.4背景知識:支配與虛繼承49
2.3.5policy對像與policy支配結構50
2.3.6polic函數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本書所實現的框架:MetaNN70
3.2.1從矩陣計算工具到深度學習框架70
3.2.2MetaNN介紹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.4MetaNN的類型體繫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.1Matrix類模板96
4.4.2特殊矩陣:平凡矩陣、全零矩陣與獨熱向量101
4.4.3引入新的矩陣類104
4.5列表105
4.5.1Batch模板105
4.5.2Array模板108
4.5.3重復與Duplicate模板113
4.6小結116
4.7練習116
第5章運算與表達式模板119
5.1表達式模板簡介119
5.2MetaNN運算模板的設計思想122
5.2.1Add模板的問題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輔助類模板OperCateCal126
5.4.4輔助類模板OperOrganizer128
5.4.5輔助類模板OperSeq130
5.5運算模板的框架131
5.5.1運算模板的類別標簽131
5.5.2UnaryOp的定義132
5.6運算實現示例133
5.6.1Sigmoid運算133
5.6.2Add運算136
5.6.3轉置運算139
5.6.4折疊運算141
5.7MetaNN已支持的運算列表141
5.7運算141
5.7運算142
5.7運算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.2DynamicData類模板161
6.2.3層的常用policy對像166
6.2.4InjectPol函數168
6.2.5通用I/O結構168
6.2.6通用操作函數169
6.3層的具體實現170
6.3.1AddLayer170
6.3.2ElementMulLayer172
6.3.3BiasLayer176
6.4MetaNN已實現的基本層181
6.5小結183
6.6練習184
第7章復合層與循環層185
7.1復合層的接口與設計理念186
7.1.1基本結構186
7.1.2結構描述語法187
7.1.3policy的繼承關繫188
7.1.4policy的修正189
7.1.5復合層的構造函數190
7.1.6一個完整的復合層構造示例190
7.2policy繼承與修正邏輯的實現191
7.2.1policy繼承邏輯的實現191
7.2.2policy修正邏輯的實現194
7.3ComposeTopology的實現195
7.3.1功能介紹195
7.3.2拓撲排序算法介紹195
7.3.3ComposeTopology包含的主要步驟196
7.3.4結構描述子句與其劃分196
7.3.5結構合法性檢查198
7.3.6拓撲排序的實現200
7.3.7子層函數203
7.4ComposeKernel的實現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.1GruStep222
7.6.2構建RecurrentLayer類模板224
7.6.3RecurrentLayer的使用230
7.7小結230
7.8練習230
第8章求值與優化233
8.1MetaNN的求值模型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.4DyanmicData與求值248
8.3求值過程的優化249
8.3.1避免重復計算249
8.3.2同類計算合並250
8.3.3多運算協同優化251
8.4小結258
8.5練習259
後記——方家休見笑,吾道本艱難260
內容簡介
《C+編程實戰:一個深度學習框架的初步實現》以一個深度學習框架的初步實現為例,討論如何在一個相對較大的項目中深編程,為繫統性能優化提供更多的可能。《C+編程實戰:一個深度學習框架的初步實現》分為8章,前兩章討論編程與編譯期計算的基本技術,後面6章則編程在深度學習框架中的實際應用,涉及富類型與標簽體繫、表達式模板函數的編寫等多個主題,詳盡地展示了如何將面向編程相結合以構造復雜繫統。《C+編程實戰:一個深度學習框架的初步實現》適合具有一定C++基礎的讀者閱讀。對主流深度學習框架的內核有一定了解的讀者,也可以參考本書,對編程與編譯期計算所實現的深度學習框架與主流的(主要基於面向對像所構造的)深度學習框架之間的差異。