深度學(xué)習(xí)框架中蘊(yùn)藏著驚人的技術(shù)和有趣的機(jī)制,本書旨在揭開這些技術(shù)和機(jī)制的神秘面紗,幫助讀者正確理解技術(shù),體會它們的有趣之處。為此,本書會帶領(lǐng)讀者從零開始創(chuàng)建一個(gè)深度學(xué)習(xí)框架DeZero。DeZero 是本書原創(chuàng)的框架,它用最少的代碼實(shí)現(xiàn)了現(xiàn)代深度學(xué)習(xí)框架的功能。本書分60 個(gè)步驟來完成這個(gè)框架,在此過程中,讀者會加深對PyTorch、TensorFlow 和Chainer 等現(xiàn)代深度學(xué)習(xí)框架的理解,看清深度學(xué)習(xí)框架的本質(zhì)。
本書沿襲《深度學(xué)習(xí)入門:基于Python 的理論與實(shí)現(xiàn)》的風(fēng)格,語言通俗,代碼簡潔,講解詳細(xì)。在自制框架的過程中,讀者還能進(jìn)一步鞏固Python 編程和軟件開發(fā)相關(guān)的知識。
本書適合對深度學(xué)習(xí)框架感興趣的讀者閱讀。
·魚書《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》作者又一力作。手把手帶你創(chuàng)建深度學(xué)習(xí)框架,直擊現(xiàn)代深度學(xué)習(xí)框架本質(zhì)!
·內(nèi)容簡明易懂,講解詳細(xì)
本書延續(xù)前作的行文風(fēng)格,采用通俗的語言和大量直觀的示意圖詳細(xì)講解,幫助讀者加深對PyTorch、TensorFlow和Chainer等現(xiàn)代深度學(xué)習(xí)框架的理解,進(jìn)一步鞏固Python編程和軟件開發(fā)的相關(guān)知識。
·通過從零創(chuàng)建,剖析深度學(xué)習(xí)框架機(jī)制
本書會從零創(chuàng)建一個(gè)深度學(xué)習(xí)框架,讓讀者在運(yùn)行程序的過程中了解深度學(xué)習(xí)框架中蘊(yùn)藏的技術(shù)與機(jī)制。通過這樣的體驗(yàn),讀者可了解到深度學(xué)習(xí)框架的本質(zhì)。
·增量開發(fā)
本書將繁雜的深度學(xué)習(xí)框架的創(chuàng)建工作分為60個(gè)步驟完成,內(nèi)容循序漸進(jìn),讀者可在一步步的實(shí)踐過程中獲得正向的反饋結(jié)果,激發(fā)學(xué)習(xí)動力。
齋藤康毅(作者) 1984年生于日本長崎縣,東京工業(yè)大學(xué)畢業(yè),并完成東京大學(xué)研究生院課程。目前在某企業(yè)從事人工智能相關(guān)的研究和開發(fā)工作。著有《深度學(xué)習(xí)入門:基于Python的理論與實(shí)現(xiàn)》,同時(shí)也是Introducing Python、Python in Practice、The Elements of Computing Systems、Building Machine Learning Systems with Python的日文版譯者。 鄭明智(譯者) 智慧醫(yī)療工程師。主要研究方向?yàn)獒t(yī)療與前沿ICT技術(shù)的結(jié)合及其應(yīng)用,密切關(guān)注人工智能、量子計(jì)算等領(lǐng)域。譯有《深度學(xué)習(xí)基礎(chǔ)與實(shí)踐》《詳解深度學(xué)習(xí)》《白話機(jī)器學(xué)習(xí)的數(shù)學(xué)》等書。
前言 xvii
第 1階段 自動微分 1
步驟1 作為箱子的變量 3
1.1 什么是變量 3
1.2 實(shí)現(xiàn)Variable 類 4
1.3 (補(bǔ)充)NumPy的多維數(shù)組 6
步驟2 創(chuàng)建變量的函數(shù) 8
2.1 什么是函數(shù) 8
2.2 Function類的實(shí)現(xiàn) 9
2.3 使用Function 類 10
步驟3 函數(shù)的連續(xù)調(diào)用 13
3.1 Exp函數(shù)的實(shí)現(xiàn) 13
3.2 函數(shù)的連續(xù)調(diào)用 14
步驟4 數(shù)值微分 16
4.1 什么是導(dǎo)數(shù) 16
4.2 數(shù)值微分的實(shí)現(xiàn) 17
4.3 復(fù)合函數(shù)的導(dǎo)數(shù) 20
4.4 數(shù)值微分存在的問題 21
步驟5 反向傳播的理論知識 22
5.1 鏈?zhǔn)椒▌t 22
5.2 反向傳播的推導(dǎo) 23
5.3 用計(jì)算圖表示 25
步驟6 手動進(jìn)行反向傳播 27
6.1 Variable 類的功能擴(kuò)展 27
6.2 Function類的功能擴(kuò)展 28
6.3 Square類和Exp類的功能擴(kuò)展 28
6.4 反向傳播的實(shí)現(xiàn) 29
步驟7 反向傳播的自動化 32
7.1 為反向傳播的自動化創(chuàng)造條件 33
7.2 嘗試反向傳播 36
7.3 增加backward方法 38
步驟8 從遞歸到循環(huán) 40
8.1 現(xiàn)在的Variable 類 40
8.2 使用循環(huán)實(shí)現(xiàn) 41
8.3 代碼驗(yàn)證 42
步驟9 讓函數(shù)更易用 43
9.1 作為Python函數(shù)使用 43
9.2 簡化backward方法 45
9.3 只支持ndarray 46
步驟10 測試 50
10.1 Python的單元測試 50
10.2 square函數(shù)反向傳播的測試 52
10.3 通過梯度檢驗(yàn)來自動測試 53
10.4 測試小結(jié) 54
第 2階段 用自然的代碼表達(dá) 59
步驟11 可變長參數(shù)(正向傳播篇) 61
11.1 修改Function 類 62
11.2 Add類的實(shí)現(xiàn) 64
步驟12 可變長參數(shù)(改進(jìn)篇) 65
12.1 第 1 項(xiàng)改進(jìn):使函數(shù)更容易使用 65
12.2 第 2 項(xiàng)改進(jìn):使函數(shù)更容易實(shí)現(xiàn) 67
12.3 add函數(shù)的實(shí)現(xiàn) 69
步驟13 可變長參數(shù)(反向傳播篇) 70
13.1 支持可變長參數(shù)的Add類的反向傳播 70
13.2 修改Variable 類 71
13.3 Square類的實(shí)現(xiàn) 73
步驟14 重復(fù)使用同一個(gè)變量 75
14.1 問題的原因 76
14.2 解決方案 77
14.3 重置導(dǎo)數(shù) 79
步驟15 復(fù)雜的計(jì)算圖(理論篇) 81
15.1 反向傳播的正確順序 82
15.2 當(dāng)前的DeZero 84
15.3 函數(shù)的優(yōu)先級 87
步驟16 復(fù)雜的計(jì)算圖(實(shí)現(xiàn)篇) 88
16.1 增加輩分變量 88
16.2 按照輩分順序取出元素 90
16.3 Variable 類的backward 92
16.4 代碼驗(yàn)證 93
步驟17 內(nèi)存管理和循環(huán)引用 97
17.1 內(nèi)存管理 97
17.2 引用計(jì)數(shù)方式的內(nèi)存管理 98
17.3 循環(huán)引用 100
17.4 weakref模塊 102
17.5 代碼驗(yàn)證 104
步驟18 減少內(nèi)存使用量的模式 106
18.1 不保留不必要的導(dǎo)數(shù) 106
18.2 回顧Function 類 109
18.3 使用Config類進(jìn)行切換 110
18.4 模式的切換 111
18.5 使用with 語句切換 112
步驟19 讓變量更易用 116
19.1 命名變量 116
19.2 實(shí)例變量ndarray 117
19.3 len函數(shù)和print 函數(shù) 119
步驟20 運(yùn)算符重載(1) 122
20.1 Mul類的實(shí)現(xiàn) 122
20.2 運(yùn)算符重載 125
步驟21 運(yùn)算符重載(2) 128
21.1 與ndarray 一起使用 128
21.2 與float 和int 一起使用 130
21.3 問題1:左項(xiàng)為float 或int 的情況 131
21.4 問題2:左項(xiàng)為ndarray 實(shí)例的情況 133
步驟22 運(yùn)算符重載(3) 134
22.1 負(fù)數(shù) 135
22.2 減法 136
22.3 除法 138
22.4 冪運(yùn)算 139
步驟23 打包 141
23.1 文件結(jié)構(gòu) 142
23.2 將代碼移到核心類 142
23.3 運(yùn)算符重載 144
23.4 實(shí)際的_ _init_ _.py 文件 146
23.5 導(dǎo)入dezero 147
步驟24 復(fù)雜函數(shù)的求導(dǎo) 149
24.1 Sphere函數(shù) 150
24.2 matyas函數(shù) 151
24.3 Goldstein Price 函數(shù) 152
第3階段 實(shí)現(xiàn)高階導(dǎo)數(shù) 161
步驟25 計(jì)算圖的可視化(1) 163
25.1 安裝Graphviz 163
25.2 使用DOT語言描述圖形 165
25.3 指定節(jié)點(diǎn)屬性 165
25.4 連接節(jié)點(diǎn) 167
步驟26 計(jì)算圖的可視化(2) 169
26.1 可視化代碼的使用示例 169
26.2 從計(jì)算圖轉(zhuǎn)換為DOT語言 171
26.3 從DOT語言轉(zhuǎn)換為圖像 174
26.4 代碼驗(yàn)證 176
步驟27 泰勒展開的導(dǎo)數(shù) 178
27.1 sin函數(shù)的實(shí)現(xiàn) 178
27.2 泰勒展開的理論知識 179
27.3 泰勒展開的實(shí)現(xiàn) 180
27.4 計(jì)算圖的可視化 182
步驟28 函數(shù)優(yōu)化 184
28.1 Rosenbrock函數(shù) 184
28.2 求導(dǎo) 185
28.3 梯度下降法的實(shí)現(xiàn) 186
步驟29 使用牛頓法進(jìn)行優(yōu)化(手動計(jì)算) 190
29.1 使用牛頓法進(jìn)行優(yōu)化的理論知識 191
29.2 使用牛頓法實(shí)現(xiàn)優(yōu)化 195
步驟30 高階導(dǎo)數(shù)(準(zhǔn)備篇) 197
30.1 確認(rèn)工作①:Variable 實(shí)例變量 197
30.2 確認(rèn)工作②:Function 類 199
30.3 確認(rèn)工作③:Variable 類的反向傳播 201
步驟31 高階導(dǎo)數(shù)(理論篇) 204
31.1 在反向傳播時(shí)進(jìn)行的計(jì)算 204
31.2 創(chuàng)建反向傳播的計(jì)算圖的方法 206
步驟32 高階導(dǎo)數(shù)(實(shí)現(xiàn)篇) 209
32.1 新的DeZero 209
32.2 函數(shù)類的反向傳播 210
32.3 實(shí)現(xiàn)更有效的反向傳播(增加模式控制代碼) 211
32.4 修改_ _init_ _.py 213
步驟33 使用牛頓法進(jìn)行優(yōu)化(自動計(jì)算) 215
33.1 求二階導(dǎo)數(shù) 215
33.2 使用牛頓法進(jìn)行優(yōu)化 217
步驟34 sin函數(shù)的高階導(dǎo)數(shù) 219
34.1 sin函數(shù)的實(shí)現(xiàn) 219
34.2 cos函數(shù)的實(shí)現(xiàn) 220
34.3 sin函數(shù)的高階導(dǎo)數(shù) 221
步驟35 高階導(dǎo)數(shù)的計(jì)算圖 225
35.1 tanh函數(shù)的導(dǎo)數(shù) 226
35.2 tanh函數(shù)的實(shí)現(xiàn) 226
35.3 高階導(dǎo)數(shù)的計(jì)算圖可視化 227
步驟36 DeZero的其他用途 234
36.1 double backprop 的用途 234
36.2 深度學(xué)習(xí)研究中的應(yīng)用示例 236
第4階段 創(chuàng)建神經(jīng)網(wǎng)絡(luò) 243
步驟37 處理張量 245
37.1 對各元素進(jìn)行計(jì)算 245
37.2 使用張量時(shí)的反向傳播 247
37.3 使用張量時(shí)的反向傳播(補(bǔ)充內(nèi)容) 249
步驟38 改變形狀的函數(shù) 254
38.1 reshape函數(shù)的實(shí)現(xiàn) 254
38.2 從Variable 對象調(diào)用reshape 258
38.3 矩陣的轉(zhuǎn)置 259
38.4 實(shí)際的transpose 函數(shù)(補(bǔ)充內(nèi)容) 262
步驟39 求和的函數(shù) 264
39.1 sum函數(shù)的反向傳播 264
39.2 sum函數(shù)的實(shí)現(xiàn) 266
39.3 axis 和keepdims 268
步驟40 進(jìn)行廣播的函數(shù) 272
40.1 broadcast_to 函數(shù)和sum_to 函數(shù) 272
40.2 DeZero的broadcast_to 函數(shù)和sum_to 函數(shù) 275
40.3 支持廣播 277
步驟41 矩陣的乘積 280
41.1 向量的內(nèi)積和矩陣的乘積 280
41.2 檢查矩陣的形狀 282
41.3 矩陣乘積的反向傳播 282
步驟42 線性回歸 288
42.1 玩具數(shù)據(jù)集 288
42.2 線性回歸的理論知識 289
42.3 線性回歸的實(shí)現(xiàn) 291
42.4 DeZero的mean_squared_error函數(shù)(補(bǔ)充內(nèi)容) 295
步驟43 神經(jīng)網(wǎng)絡(luò) 298
43.1 DeZero中的linear 函數(shù) 298
43.2 非線性數(shù)據(jù)集 301
43.3 激活函數(shù)和神經(jīng)網(wǎng)絡(luò) 302
43.4 神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn) 303
步驟44 匯總參數(shù)的層 307
44.1 Parameter類的實(shí)現(xiàn) 307
44.2 Layer類的實(shí)現(xiàn) 309
44.3 Linear類的實(shí)現(xiàn) 312
44.4 使用Layer實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò) 314
步驟45 匯總層的層 316
45.1 擴(kuò)展Layer類 316
45.2 Model類 319
45.3 使用Model來解決問題 321
45.4 MLP類 323
步驟46 通過Optimizer更新參數(shù) 325
46.1 Optimizer類 325
46.2 SGD類的實(shí)現(xiàn) 326
46.3 使用SGD類來解決問題 327
46.4 SGD以外的優(yōu)化方法 328
步驟47 softmax函數(shù)和交叉熵誤差 331
47.1 用于切片操作的函數(shù) 331
47.2 softmax函數(shù) 334
47.3 交叉熵誤差 337
步驟48 多分類 340
48.1 螺旋數(shù)據(jù)集 340
48.2 用于訓(xùn)練的代碼 341
步驟49 Dataset類和預(yù)處理 346
49.1 Dataset類的實(shí)現(xiàn) 346
49.2 大型數(shù)據(jù)集的情況 348
49.3 數(shù)據(jù)的連接 349
49.4 用于訓(xùn)練的代碼 350
49.5 數(shù)據(jù)集的預(yù)處理 351
步驟50 用于取出小批量數(shù)據(jù)的DataLoader 354
50.1 什么是迭代器 354
50.2 使用DataLoader 358
50.3 accuracy函數(shù)的實(shí)現(xiàn) 359
50.4 螺旋數(shù)據(jù)集的訓(xùn)練代碼 360
步驟51 MINST的訓(xùn)練 363
51.1 MNIST數(shù)據(jù)集 364
51.2 訓(xùn)練MNIST 366
51.3 改進(jìn)模型 368
第5階段 DeZero高級挑戰(zhàn) 377
步驟52 支持GPU 379
52.1 CuPy的安裝和使用方法 379
52.2 cuda模塊 382
52.3 向Variable / Layer / DataLoader 類添加代碼 383
52.4 函數(shù)的相應(yīng)修改 386
52.5 在GPU上訓(xùn)練MNIST 388
步驟53 模型的保存和加載 391
53.1 NumPy的save 函數(shù)和load 函數(shù) 391
53.2 Layer類參數(shù)的扁平化 394
53.3 Layer類的save 函數(shù)和load 函數(shù) 395
步驟54 Dropout和測試模式 398
54.1 什么是Dropout 398
54.2 Inverted Dropout 401
54.3 增加測試模式 401
54.4 Dropout的實(shí)現(xiàn) 402
步驟55 CNN的機(jī)制(1) 404
55.1 CNN的網(wǎng)絡(luò)結(jié)構(gòu) 404
55.2 卷積運(yùn)算 405
55.3 填充 407
55.4 步幅 408
55.5 輸出大小的計(jì)算方法 409
步驟56 CNN的機(jī)制(2) 411
56.1 三階張量 411
56.2 結(jié)合方塊進(jìn)行思考 412
56.3 小批量處理 414
56.4 池化層 415
步驟57 conv2d函數(shù)和pooling函數(shù) 418
57.1 使用im2col 展開 418
57.2 conv2d函數(shù)的實(shí)現(xiàn) 420
57.3 Conv2d層的實(shí)現(xiàn) 425
57.4 pooling 函數(shù)的實(shí)現(xiàn) 426
步驟58 具有代表性的CNN(VGG16) 429
58.1 VGG16的實(shí)現(xiàn) 429
58.2 已訓(xùn)練的權(quán)重?cái)?shù)據(jù) 431
58.3 使用已訓(xùn)練的VGG16 435
步驟59 使用RNN處理時(shí)間序列數(shù)據(jù) 438
59.1 RNN層的實(shí)現(xiàn) 438
59.2 RNN模型的實(shí)現(xiàn) 442
59.3 切斷連接的方法 445
59.4 正弦波的預(yù)測 446
步驟60 LSTM與數(shù)據(jù)加載器 451
60.1 用于時(shí)間序列數(shù)據(jù)的數(shù)據(jù)加載器 451
60.2 LSTM層的實(shí)現(xiàn) 453
附錄A in place 運(yùn)算(步驟14的補(bǔ)充內(nèi)容) 463
A.1 問題確認(rèn) 463
A.2 關(guān)于復(fù)制和覆蓋 464
A.3 DeZero的反向傳播 465
附錄B 實(shí)現(xiàn)get_item函數(shù)(步驟47的補(bǔ)充內(nèi)容) 466
附錄C 在Google Colaboratory上運(yùn)行 469
后 記 473
參考文獻(xiàn) 477