PyTorch 深度學習實戰 (Deep Learning with Pytorch)

[美]伊萊·史蒂文斯(Eli Stevens),[意]盧卡·安蒂加(Luca Antiga),[德]托馬斯·菲曼(Thomas Viehmann)

  • PyTorch 深度學習實戰 (Deep Learning with Pytorch)-preview-1
  • PyTorch 深度學習實戰 (Deep Learning with Pytorch)-preview-2
PyTorch 深度學習實戰 (Deep Learning with Pytorch)-preview-1

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

相關主題

商品描述

雖然很多深度學習工具都使用Python,但PyTorch 庫是真正具備Python 風格的。對於任何瞭解NumPy 和scikit-learn 等工具的人來說,上手PyTorch 輕而易舉。PyTorch 在不犧牲高級特性的情況下簡化了深度學習,它非常適合構建快速模型,並且可以平穩地從個人應用擴展到企業級應用。由於像蘋果、Facebook和摩根大通這樣的公司都使用PyTorch,所以當你掌握了PyTorth,就會擁有更多的職業選擇。

本書是教你使用 PyTorch 創建神經網絡和深度學習系統的實用指南。它幫助讀者快速從零開始構建一個真實示例:腫瘤圖像分類器。在此過程中,它涵蓋了整個深度學習管道的關鍵實踐,包括 PyTorch張量 API、用 Python 加載數據、監控訓練以及將結果進行可視化展示。

 

本書主要內容:

(1)訓練深層神經網絡;

(2)實現模塊和損失函數;

(3)使用 PyTorch Hub 預先訓練的模型;

(4)探索在 Jupyter Notebooks 中編寫示例代碼。

 

本書適用於對深度學習感興趣的 Python 程序員。瞭解深度學習的基礎知識對閱讀本書有一定的幫助,但讀者無須具有使用 PyTorch 或其他深度學習框架的經驗。

作者簡介

作者

伊莱·史蒂文斯(Eli Stevens)职业生涯的大部分时间都在美国硅谷的初创公司工作,从软件工程师(网络设备制造业)到首席技术官(开发肿瘤放疗软件)。在本书出版时,他正在汽车自动驾驶行业从事机器学习相关工作。

 

卢卡·安蒂加(Luca Antiga)于21 世纪初担任生物医学工程研究员。2010 年到2020 年间,他是一家人工智能工程公司的联合创始人和首席技术官。他参与了多个开源项目,包括PyTorch 的核心模块。最近,他作为联合创始人创建了一家总部位于美国的初创公司,专注于数据定义软件的基础设施。

 

托马斯·菲曼(Thomas Viehmann)是一名德国慕尼黑的机器学习和PyTorch 的专业培训师和顾问,也是PyTorch 核心开发人员。拥有数学博士学位的他不畏惧理论,擅长将理论应用于实际的计算挑战。

 

译者

牟大恩,武汉大学硕士研究生毕业,曾先后在网易杭州研究院、优酷土豆集团、海通证券总

部负责技术研发及系统架构设计工作,目前任职于东方证券资产管理有限公司。他有多年的Java

开发及系统设计经验,专注于互联网金融及大数据应用相关领域,热爱技术,喜欢钻研前沿技术,

是机器学习及深度学习的深度爱好者。近年来著有《Kafka 入门与实践》,译有《Kafka Streams

实战》,已提交技术发明专利申请两项。

目錄大綱

第 1部分 PyTorch核心

第 1章 深度學習和PyTorch庫簡介 3

1.1 深度學習革命 4

1.2 PyTorch深度學習 5

1.3 為什麽用PyTorch 6

1.4 PyTorch如何支持深度學習概述 8

1.5 硬件和軟件要求 10

1.6 練習題 12

1.7 本章小結 13

 

第 2章 預訓練網絡 14

2.1 一個識別圖像主體的預訓練網絡 15

2.1.1 獲取一個預先訓練好的網絡用於圖像識別 16

2.1.2 AlexNet 17

2.1.3 ResNet 19

2.1.4 準備運行 19

2.1.5 運行模型 21

2.2 一個足以以假亂真的預訓練模型 23

2.2.1 GAN游戲 24

2.2.2 CycleGAN 25

2.2.3 一個把馬變成斑馬的網絡 26

2.3 一個描述場景的預訓練網絡 29

2.4 Torch Hub 31

2.5 總結 32

2.6 練習題 32

2.7 本章小結 33

 

第3章 從張量開始 34

3.1 實際數據轉為浮點數 34

3.2 張量:多維數組 36

3.2.1 從Python列表到PyTorch張量 36

3.2.2 構造第 1個張量 37

3.2.3 張量的本質 37

3.3 索引張量 40

3.4 命名張量 40

3.5 張量的元素類型 43

3.5.1 使用dtype指定數字類型 43

3.5.2 適合任何場合的dtype 44

3.5.3 管理張量的dtype屬性 44

3.6 張量的API 45

3.7 張量的存儲視圖 46

3.7.1 索引存儲區 47

3.7.2 修改存儲值:就地操作 48

3.8 張量元數據:大小、偏移量和步長 48

3.8.1 另一個張量的存儲視圖 49

3.8.2 無復制轉置 51

3.8.3 高維轉置 52

3.8.4 連續張量 53

3.9 將張量存儲到GPU 55

3.10 NumPy互操作性 57

3.11 廣義張量也是張量 57

3.12 序列化張量 58

3.13 總結 60

3.14 練習題 60

3.15 本章小結 60

 

第4章 使用張量表徵真實數據 61

4.1 處理圖像 62

4.1.1 添加顏色通道 62

4.1.2 加載圖像文件 63

4.1.3 改變佈局 63

4.1.4 正規化數據 64

4.2 三維圖像:體數據 65

4.3 表示表格數據 66

4.3.1 使用真實的數據集 67

4.3.2 加載葡萄酒數據張量 68

4.3.3 表示分數 70

4.3.4 獨熱編碼 70

4.3.5 何時分類 72

4.3.6 尋找閾值 73

4.4 處理時間序列 75

4.4.1 增加時間維度 76

4.4.2 按時間段調整數據 77

4.4.3 準備訓練 79

4.5 表示文本 81

4.5.1 將文本轉化為數字 81

4.5.2 獨熱編碼字符 82

4.5.3 獨熱編碼整個詞 83

4.5.4 文本嵌入 85

4.5.5 作為藍圖的文本嵌入 87

4.6 總結 88

4.7 練習題 88

4.8 本章小結 88

 

第5章 學習的機制 90

5.1 永恆的建模經驗 90

5.2 學習就是參數估計 92

5.2.1 一個熱點問題 93

5.2.2 收集一些數據 93

5.2.3 可視化數據 94

5.2.4 選擇線性模型首試 94

5.3 減少損失是我們想要的 95

5.4 沿著梯度下降 98

5.4.1 減小損失 99

5.4.2 進行分析 99

5.4.3 迭代以適應模型 101

5.4.4 歸一化輸入 104

5.4.5 再次可視化數據 106

5.5 PyTorch自動求導:反向傳播的一切 107

5.5.1 自動計算梯度 107

5.5.2 優化器 111

5.5.3 訓練、驗證和過擬合 115

5.5.4 自動求導更新及關閉 120

5.6 總結 121

5.7 練習題 122

5.8 本章小結 122

 

第6章 使用神經網絡擬合數據 123

6.1 人工神經網絡 124

6.1.1 組成一個多層網絡 125

6.1.2 理解誤差函數 125

6.1.3 我們需要的只是激活函數 126

6.1.4 更多激活函數 128

6.1.5 選擇最佳激活函數 128

6.1.6 學習對於神經網絡意味著什麽 129

6.2 PyTorch nn模塊 131

6.2.1 使用__call__()而不是forward() 132

6.2.2 回到線性模型 133

6.3 最終完成一個神經網絡 137

6.3.1 替換線性模型 137

6.3.2 檢查參數 138

6.3.3 與線性模型對比 141

6.4 總結 142

6.5 練習題 142

6.6 本章小結 142

 

第7章 區分鳥和飛機:從圖像學習 143

7.1 微小圖像數據集 143

7.1.1 下載CIFAR-10 144

7.1.2 Dataset類 145

7.1.3 Dataset變換 146

7.1.4 數據歸一化 149

7.2 區分鳥和飛機 150

7.2.1 構建數據集 151

7.2.2 一個全連接模型 152

7.2.3 分類器的輸出 153

7.2.4 用概率表示輸出 154

7.2.5 分類的損失 157

7.2.6 訓練分類器 159

7.2.7 全連接網絡的局限 165

7.3 總結 167

7.4 練習題 167

7.5 本章小結 168

 

第8章 使用捲積進行泛化 169

8.1 捲積介紹 169

8.2 捲積實戰 172

8.2.1 填充邊界 173

8.2.2 用捲積檢測特徵 175

8.2.3 使用深度和池化技術進一步研究 177

8.2.4 為我們的網絡整合一切 179

8.3 子類化nn.Module 181

8.3.1 將我們的網絡作為一個nn.Module 182

8.3.2 PyTorch如何跟蹤參數和子模塊 183

8.3.3 函數式API 184

8.4 訓練我們的convnet 185

8.4.1 測量精度 187

8.4.2 保存並加載我們的模型 188

8.4.3 在GPU上訓練 188

8.5 模型設計 190

8.5.1 增加內存容量:寬度 191

8.5.2 幫助我們的模型收斂和泛化:正則化 192

8.5.3 深入學習更復雜的結構:深度 195

8.5.4 本節設計的比較 200

8.5.5 已經過時了 201

8.6 總結 201

8.7 練習題 201

8.8 本章小結 202

 

第 2部分 從現實世界的圖像中學習:肺癌的早期檢測

第9章 使用PyTorch來檢測癌症 205

9.1 用例簡介 205

9.2 為一個大型項目做準備 206

9.3 到底什麽是CT掃描 207

9.4 項目:肺癌的端到端檢測儀 210

9.4.1 為什麽我們不把數據扔給神經網絡直到它起作用呢 213

9.4.2 什麽是結節 216

9.4.3 我們的數據來源:LUNA大挑戰賽 217

9.4.4 下載LUNA數據集 218

9.5 總結 219

9.6 本章小結 219

 

第 10章 將數據源組合成統一的數據集 220

10.1 原始CT數據文件 222

10.2 解析LUNA的標註 數據 222

10.2.1 訓練集和驗證集 224

10.2.2 統一標註和候選 數據 225

10.3 加載單個CT掃描 227

10.4 使用病人坐標系定位結節 230

10.4.1 病人坐標系 230

10.4.2 CT掃描形狀和體素大小 232

10.4.3 毫米和體素地址之間的轉換 233

10.4.4 從CT掃描中取出一個結節 234

10.5 一個簡單的數據集實現 235

10.5.1 使用getCtRawCandidate()函數緩存候選數組 238

10.5.2 在LunaDataset.__init__()中構造我們的數據集 238

10.5.3 分隔訓練集和驗證集 239

10.5.4 呈現數據 240

10.6 總結 241

10.7 練習題 241

10.8 本章小結 242

 

第 11章 訓練分類模型以檢測可疑腫瘤 243

11.1 一個基本的模型和訓練循環 243

11.2 應用程序的主入口點 246

11.3 預訓練和初始化 247

11.3.1 初始化模型和優化器 247

11.3.2 數據加載器的維護和供給 249

11.4 我們的首次神經網絡設計 251

11.4.1 核心捲積 251

11.4.2 完整模型 254

11.5 訓練和驗證模型 257

11.5.1 computeBatchLoss()函數 258

11.5.2 類似的驗證循環 260

11.6 輸出性能指標 261

11.7 運行訓練腳本 265

11.7.1 訓練所需的數據 266

11.7.2 插曲:enumerateWithEstimate()函數 266

11.8 評估模型:得到99.7%的正確率是否意味著我們完成了任務 268

11.9 用TensorBoard繪制訓練指標 269

11.9.1 運行TensorBoard 269

11.9.2 增加TensorBoard對指標記錄函數的支持 272

11.10 為什麽模型不學習檢測結節 274

11.11 總結 275

11.12 練習題 275

11.13 本章小結 275

 

第 12章 通過指標和數據增強來提升訓練 277

12.1 高級改進計劃 278

12.2 好狗與壞狗:假陽性與假陰性 279

12.3 用圖表表示陽性與陰性 280

12.3.1 召回率是Roxie的強項 282

12.3.2 精度是Preston的強項 283

12.3.3 在logMetrics()中實現精度和召回率 284

12.3.4 我們的終極性能指標:F1分數 285

12.3.5 我們的模型在新指標下表現如何 289

12.4 理想的數據集是什麽樣的 290

12.4.1 使數據看起來更理想化 292

12.4.2 使用平衡的LunaDataset與之前的數據集運行情況對比 296

12.4.3 認識過擬合 298

12.5 重新審視過擬合的問題 300

12.6 通過數據增強防止過擬合 300

12.6.1 具體的數據增強技術 301

12.6.2 看看數據增強帶來的改進 306

12.7 總結 308

12.8 練習題 308

12.9 本章小結 309

 

第 13章 利用分割法尋找可疑結節 310

13.1 向我們的項目添加第 2個模型 310

13.2 各種類型的分割 312

13.3 語義分割:逐像素分類 313

13.4 更新分割模型 317

13.5 更新數據集以進行分割 319

13.5.1 U-Net有非常具體的對輸入大小的要求 320

13.5.2 U-Net對三維和二維數據的權衡 320

13.5.3 構建真實、有效的數據集 321

13.5.4 實現Luna2dSegmentationDataset 327

13.5.5 構建訓練和驗證數據 331

13.5.6 實現TrainingLuna2dSegmentationDataset 332

13.5.7 在GPU上增強數據 333

13.6 更新用於分割的訓練腳本 335

13.6.1 初始化分割和增強模型 336

13.6.2 使用Adam優化器 336

13.6.3 骰子損失 337

13.6.4 將圖像導入TensorBoard 340

13.6.5 更新指標日誌 343

13.6.6 保存模型 344

13.7 結果 345

13.8 總結 348

13.9 練習題 348

13.10 本章小結 349

 

第 14章 端到端的結節分析及下一步的方向 350

14.1 接近終點線 350

14.2 驗證集的獨立性 352

14.3 連接CT分割和候選結節分類 353

14.3.1 分割 354

14.3.2 將體素分組為候選結節 355

14.3.3 我們發現結節了嗎?分類以減少假陽性 357

14.4 定量驗證 360

14.5 預測惡性腫瘤 361

14.5.1 獲取惡性腫瘤信息 361

14.5.2 曲線基線下的區域:按直徑分類 362

14.5.3 重用預先存在的權重:微調 365

14.5.4 TensorBoard中的輸出 370

14.6 在診斷時所見的內容 374

14.7 接下來呢?其他靈感和數據的來源 376

14.7.1 防止過擬合:更好的正則化 377

14.7.2 精細化訓練數據 379

14.7.3 競賽結果及研究論文 380

14.8 總結 381

14.9 練習題 382

14.10 本章小結 383

 

第3部分 部署

第 15章 部署到生產環境 387

15.1 PyTorch模型的服務 388

15.1.1 支持Flask服務的模型 388

15.1.2 我們想從部署中得到的東西 390

15.1.3 批處理請求 391

15.2 導出模型 395

15.2.1 PyTorch與ONNX的互操作性 396

15.2.2 PyTorch自己的導出:跟蹤 397

15.2.3 具有跟蹤模型的服務器 398

15.3 與PyTorch JIT編譯器交互 398

15.3.1 超越經典Python/PyTorch的期望是什麽 399

15.3.2 PyTorch作為接口和後端的雙重特性 400

15.3.3 TorchScript 400

15.3.4 為可追溯的差異編寫腳本 404

15.4 LibTorch:C++中的PyTorch 405

15.4.1 從C++中運行JITed模型 405

15.4.2 從C++ API開始 408

15.5 部署到移動設備 411

15.6 新興技術:PyTorch

 模型的企業服務 416

15.7 總結 416

15.8 練習題 416

15.9 本章小結 416