深度學習框架 PyTorch:入門與實踐, 2/e

王博,周藍翔,陳雲

買這商品的人也買了...

商品描述

本書從多維數組Tensor開始,循序漸進地介紹PyTorch各方面的基礎知識,並結合深度學習中的經典應用,帶領讀者從零開始完成幾個經典而有趣的實際項目,包括動漫頭像生成、風格遷移、自動寫詩以及目標檢測。本書還介紹了PyTorch的幾個高級擴展,包括向量化計算、分佈式加速以及CUDA擴展。本書既適合深度學習的初學者及第一次接觸PyTorch的研究人員閱讀,也適合有一定PyTorch使用經驗的用戶閱讀,幫助他們建立對PyTorch的基本認識,提高使用PyTorch框架解決實際問題的能力。

作者簡介

王博:北京郵電大學模式識別實驗室在讀碩士研究生,主要研究方向為深度學習與計算機視覺。Python程序員,PyTorch推廣者。作為助教為大一學生講解《人工智能導論》實驗課程,受到同學們的好評。陳雲:多倫多大學在讀計算機博士生,現任waabi.ai研究員。曾在Uber ATG從事無人駕駛研究,獲得CVPR2021最佳論文提名。

目錄大綱

第1 章深度學習框架簡介1
1.1 深度學習框架編年史. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 pytorch 與tensorflow 的對比. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3 為什麼選擇pytorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

第2 章pytorch 快速入門11
2.1 安裝與配置. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 在linux 系統下安裝pytorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2 在windows 系統下安裝pytorch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.3 學習工具介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.4 服務器開發介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2 pytorch 快速入門指南. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.1 tensor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.2 autograd:自動微分. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.3 神經網絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.2.4 小試牛刀:cifar-10 分類. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.3 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

第3 章tensor 和autograd 43
3.1 tensor 基礎. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.1.1 tensor 的基本操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.1.2 命名張量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.1.3 tensor 與numpy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
3.1.4 tensor 的基本結構. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.1.5 變形記:n 種改變tensor 形狀的方法. . . . . . . . . . . . . . . . . . . . . . . . . 65
3.2 小試牛刀:線性回歸. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.3 autograd 和計算圖基礎. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
3.3.1 autograd 的用法:requires_grad 與backward . . . . . . . . . . . . . . . . . . . . . 73
3.3.2 autograd 的原理:計算圖. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
3.3.3 擴展autograd:function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.3.4 小試牛刀:利用autograd 實現線性回歸. . . . . . . . . . . . . . . . . . . . . . . . 84
3.4 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

第4 章神經網絡工具箱nn 89
4.1 nn.module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4.2 常用的神經網絡層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2.1 圖像相關層. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
4.2.2 激活函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
4.2.3 構建神經網絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
4.2.4 循環神經網絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.2.5 損失函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
4.3 nn.functional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3.1 nn.functional 與nn.module 的區別. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
4.3.2 採樣函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.4 初始化策略. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
4.5 優化器. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
4.6 nn.module 深入分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.7 小試牛刀:搭建resnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.8 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

第5 章pytorch 中常用的工具121
5.1 數據處理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.1.1 dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
5.1.2 dataloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
5.2 預訓練模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
5.3 可視化工具. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3.1 tensorboard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
5.3.2 visdom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
5.4 使用gpu 加速:cuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
5.5 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

第6 章向量化155
6.1 向量化簡介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
6.2 廣播法則. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
6.3 索引操作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.3.1 基本索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6.3.2 高級索引. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
6.3.3 einsum / einops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
6.4 小試牛刀:使用向量化思想解決實際問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
6.4.1 box_iou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
6.4.2 roi align . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
6.4.3 反向unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
6.5 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

第7 章pytorch 與multi-gpu 187
7.1 單機多卡並行. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.1.1 並行原理介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
7.1.2 dataparallel 使用示例. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
7.2 分佈式系統. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.2.1 分佈式系統的基本概念. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
7.2.2 分佈式消息傳遞接口. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
7.2.3 小試牛刀:分佈式計算實操演練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
7.3 pytorch 分佈式訓練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.3.1 使用mpi 進行分佈式訓練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
7.3.2 使用torch.distributed 進行分佈式訓練. . . . . . . . . . . . . . . . . . . . . . . . . 201
7.3.3 使用horovod 進行分佈式訓練. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
7.4 分佈式訓練中的注意事項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.4.1 保持同步. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
7.4.2 進程協作. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
7.4.3 常用調試技巧. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
7.5 進階擴展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
7.6 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

第8 章cuda 擴展與編譯211
8.1 pytorch c++ 擴展簡介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
8.1.1 c++ 擴展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
8.1.2 cuda 擴展. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
8.2 cuda、nvidia-driver、cudnn、pytorch 之間的關係. . . . . . . . . . . . . . . . . 222
8.3 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

第9 章pytorch 實戰指南227
9.1 編程實戰:貓和狗二分類. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
9.1.1 比賽介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
9.1.2 文件組織結構. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
9.1.3 __init__.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
9.1.4 數據加載. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
9.1.5 模型定義. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
9.1.6 工具函數. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
9.1.7 配置文件. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
9.1.8 main.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
9.1.9 使用. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.1.10 爭議. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
9.2 pytorch 調試指南. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.2.1 ipdb 介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
9.2.2 在pytorch 中調試. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
9.3 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

第10 章ai 插畫師:生成對抗網絡255
10.1 gan 原理簡介. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
10.2 使用gan 生成動漫人物頭像. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
10.3 實驗結果分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
10.4 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

第11 章ai 詩人:用transformer 寫詩271
11.1 自然語言處理的基礎知識. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
11.1.1 詞向量. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
11.1.2 rnn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
11.2 charrnn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
11.3 transformer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
11.3.1 自註意力模塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
11.3.2 位置編碼模塊. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
11.4 使用pytorch 實現transformer 寫詩. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
11.5 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

第12 章ai 藝術家:神經網絡風格遷移295
12.1 風格遷移原理介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
12.2 使用pytorch 實現風格遷移. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
12.3 實驗結果分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
12.4 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310

第13 章centernet:目標檢測311
13.1 目標檢測概述. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
13.2 centernet 原理介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
13.3 使用pytorch 實現centernet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
13.3.1 使用pycocotools 加載coco 數據集. . . . . . . . . . . . . . . . . . . . . . . . . . 318
13.3.2 搭建centernet 網絡. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
13.4 實驗結果分析. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
13.5 小結. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
參考文獻331