- 學(xué)習(xí)基本PyTorch語法和設(shè)計(jì)模式。
- 創(chuàng)建定制模型和數(shù)據(jù)變換。
- 使用GPU和TPU訓(xùn)練和部署模型。
- 訓(xùn)練和測(cè)試一個(gè)深度學(xué)習(xí)分類器。
- 使用優(yōu)化和分布式訓(xùn)練加速訓(xùn)練。
- 利用PyTorch庫和PyTorch生態(tài)系統(tǒng)。
這本簡明便捷的參考手冊(cè)將讓你充分掌握最流行的深度學(xué)習(xí)研究和開發(fā)框架之一:PyTorch。本書作者清晰地介紹了語法和設(shè)計(jì)模式,并提供了代碼示例,可以加快你的開發(fā),減少搜尋答案花費(fèi)的時(shí)間。
科學(xué)家、機(jī)器學(xué)習(xí)工程師和軟件開發(fā)人員可以從中找到簡明的結(jié)構(gòu)化PyTorch代碼,這涵蓋神經(jīng)網(wǎng)絡(luò)開發(fā)的每一個(gè)步驟,包括加載數(shù)據(jù)、定制訓(xùn)練循環(huán)、模型優(yōu)化,以及GPU/TPU加速。另外還能很快學(xué)會(huì)如何使用AWS、Google Cloud或Azure將代碼部署到生產(chǎn)環(huán)境,以及如何將機(jī)器學(xué)習(xí)模型部署到移動(dòng)和邊緣設(shè)備。
前言
這是一個(gè)讓人歡欣鼓舞的時(shí)代!有些人很幸運(yùn),經(jīng)歷了技術(shù)的一個(gè)個(gè)巨大進(jìn)步個(gè)人計(jì)算機(jī)的發(fā)明、互聯(lián)網(wǎng)的誕生,手機(jī)的廣泛使用,以及社交媒體的出現(xiàn)。如今,人工智能領(lǐng)域正在取得重大突破!
注視這一變化并成為這個(gè)變化的一部分著實(shí)令人興奮。我想我們才剛剛起步,想到未來十年世界將會(huì)發(fā)生怎樣的變化,簡直無法想象。我們生活在這樣的時(shí)代,能夠參與人工智能的蓬勃擴(kuò)張,這真是太棒了!
毫無疑問,PyTorch 促使深度學(xué)習(xí)和人工智能領(lǐng)域取得了一些巨大的進(jìn)步。PyTorch 可以免費(fèi)下載和使用,任何人只要有計(jì)算機(jī)或者能上網(wǎng)就可以開展人工智能實(shí)驗(yàn)。除了類似本書的比較全面的參考資料,還有很多免費(fèi)和便宜的培訓(xùn)課程、博客文章和教程可以幫助你。任何人都可以使用PyTorch 著手研究機(jī)器學(xué)習(xí)和人工智能。
本書面向的讀者對(duì)象
這本書既面向初學(xué)者,又面向?qū)C(jī)器學(xué)習(xí)和人工智能感興趣的高級(jí)用戶。如果你有編寫Python 代碼的一些經(jīng)驗(yàn),對(duì)數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)有基本的了解,這會(huì)很有幫助。
如果你剛接觸機(jī)器學(xué)習(xí),這本書會(huì)幫助你了解PyTorch 的基礎(chǔ)知識(shí),并提供一些簡單的示例。如果你使用過其他框架,如TensorFlow、Caffe2 或MXNet,這本書會(huì)幫助你熟悉PyTorch API 及其編程思維,來拓展你的技能。如果你使用過PyTorch,這本書會(huì)幫助你擴(kuò)充一些高級(jí)主題的知識(shí),如加速和優(yōu)化,并提供快速參考資源,幫助你在日常開發(fā)中使用PyTorch。
為什么寫這本書
學(xué)習(xí)和掌握PyTorch 可能很令人興奮。有太多的東西需要探索!我剛開始學(xué)習(xí)PyTorch 時(shí),很希望有一個(gè)資源能教會(huì)我一切。我希望它能提供一個(gè)很好的高層概述,使我了解PyTorch 提供了什么,還希望它能提供一些示例,在我需要更深入地研究時(shí)能提供足夠多的詳細(xì)信息。
關(guān)于PyTorch 有一些非常好的書和課程,不過它們通常側(cè)重于張量和深度學(xué)習(xí)模型的訓(xùn)練。PyTorch 在線文檔也很好,提供了大量詳細(xì)信息和示例。不過,我發(fā)現(xiàn)使用文檔往往很麻煩。我必須不停地點(diǎn)擊來學(xué)習(xí),或者用Google 搜索我需要知道的知識(shí)。我希望書桌上能有一本合適的書,在我編寫代碼時(shí)可以查閱和參考。
我的目標(biāo)是讓這成為你的終極PyTorch 參考書。除了通讀全書,對(duì)可用的PyTorch 資源有一個(gè)高層認(rèn)識(shí),我還希望你能重點(diǎn)查閱關(guān)鍵的部分來完成你的開發(fā)工作,并把這本書留在案頭。這樣一來,如果你忘記了某個(gè)內(nèi)容,就能立即得到答案。如果你更喜歡電子書或在線書,還可以在線加書簽。不論你如何使用這本書,我希望它能幫助你用PyTorch 創(chuàng)造出令人驚嘆的新技術(shù)!
本書組織
如果你剛開始學(xué)習(xí)PyTorch,應(yīng)當(dāng)從第1 章開始,按順序閱讀每一章。這些章節(jié)將從入門級(jí)逐步轉(zhuǎn)入高級(jí)主題。如果你對(duì)PyTorch 已經(jīng)有一些經(jīng)驗(yàn),可能想直接跳到你最感興趣的主題。不要忘記查看有關(guān)PyTorch 生態(tài)系統(tǒng)的第8 章。你肯定能發(fā)現(xiàn)一些新東西!
本書的組織結(jié)構(gòu)如下:
第1 章對(duì)PyTorch 提供了一個(gè)簡要介紹,將幫助你建立開發(fā)環(huán)境,并提供了一個(gè)有趣的例子讓你自己嘗試。
第2 章介紹張量,這是PyTorch 的基本構(gòu)建模塊,它是PyTorch 中所有一切的基礎(chǔ)。
第3 章全面介紹了如何使用PyTorch 完成深度學(xué)習(xí),第4 章提供了一些示例參考設(shè)計(jì),以便你了解PyTorch 的實(shí)際使用。
第5 章和第6 章介紹更高級(jí)的主題。第5 章介紹如何為你自己的工作定制PyTorch 組件。第6 章則介紹如何加速訓(xùn)練和優(yōu)化你的模型。
第7 章介紹如何通過本地機(jī)器、云服務(wù)器和移動(dòng)或邊緣設(shè)備將PyTorch 部署到生產(chǎn)環(huán)境。
第8 章介紹PyTorch 生態(tài)系統(tǒng),描述流行的包,并列出另外一些培訓(xùn)資源,來指導(dǎo)你下一步的工作。
本書使用約定
本書使用以下排版約定:
斜體(Italic)
表示新術(shù)語、URL、email 地址、文件名和文件擴(kuò)展名。
定寬字體(Constant width)
用于程序代碼清單,以及在段落中用來指示程序元素,如變量或函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關(guān)鍵字。
定寬粗體(Constant width bold)
表示要由用戶鍵入的命令或其他文字。另外,在表格中粗體還用來強(qiáng)調(diào)函數(shù)。
定寬斜體(Constant width italic)
表示用定寬斜體顯示的文字要替換為用戶提供的值或由上下文確定的值。另外,表格中用斜體顯示的變換目前TorchScript 還不支持。
使用代碼示例
這本書的補(bǔ)充材料(代碼示例,練習(xí)等)可以從https://github.com/joe-papa/pytorch-book 下載。
如果你有技術(shù)問題,或者使用代碼示例時(shí)遇到問題,請(qǐng)發(fā)送電子郵件至bookquestions@oreilly.com。
本書的目的是要幫助你完成工作。一般來講,如果書中提供了示例代碼,你可以在你的程序和文檔中使用這些示例代碼,不需要聯(lián)系我們來得到許可,除非你直接復(fù)制了大部分的代碼。例如,如果你在編寫一個(gè)程序,使用了本書中的多段代碼,這并不需要得到許可。但是出售或發(fā)行OReilly 書的示例代碼則需要得到許可;卮饐栴}時(shí)如果引用了這本書的文字和示例代碼,這不需要得到許可。但是如果你的產(chǎn)品文檔借用了本書中的大量示例代碼,則需要得到許可。
我們希望但不嚴(yán)格要求標(biāo)明引用出處。引用信息通常包括書名、作者、出版商和ISBN。例如,PyTorch Pocket Reference by Joe Papa (OReilly). Copyright 2021 Mobile Insights Technology Group, LLC, 978-1-492-09000-7。
如果你認(rèn)為你在使用代碼示例時(shí)超出了合理使用范圍或者上述許可范圍,可以隨時(shí)聯(lián)系我們:permissions@oreilly.com。
OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning)
近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。
我們有一群獨(dú)家專家和創(chuàng)新者,他們通過圖書、文章、會(huì)議和在線學(xué)習(xí)平臺(tái)分享知識(shí)和技術(shù)。OReilly 的在線學(xué)習(xí)平臺(tái)提供按需訪問的直播培訓(xùn)課程、詳細(xì)的學(xué)習(xí)路徑、交互式編程環(huán)境,以及由OReilly 和其他200 多家出版社出版的書籍和視頻。詳情請(qǐng)?jiān)L問http://oreilly.com。
聯(lián)系方式
請(qǐng)將你對(duì)本書的評(píng)價(jià)和問題發(fā)給出版社:
美國:
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035)
針對(duì)這本書,我們還建有一個(gè)網(wǎng)頁,列出了有關(guān)勘誤、示例和其他信息?梢酝ㄟ^以下地址訪問這個(gè)頁面:https://oreil.ly/PyTorch-pocket。
如果對(duì)這本書有什么意見,或者詢問技術(shù)上的問題,請(qǐng)發(fā)送電子郵件至errata@oreilly.com.cn。
要了解關(guān)于我們的圖書和課程的新聞和信息,請(qǐng)?jiān)L問我們的網(wǎng)站:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
作為一個(gè)讀者,每當(dāng)我看到其他作者的致謝時(shí)都很有感觸。寫一本書不是件簡單的任務(wù),特別是寫一本好書需要很多人的支持。閱讀這些致謝會(huì)不斷提醒我們:僅憑我們自己是無法完成這個(gè)任務(wù)的。
要感謝我的朋友Matt Kirk 的支持和鼓勵(lì),他是我多年前在OReilly 會(huì)議上認(rèn)識(shí)的。他對(duì)個(gè)人開發(fā)的熱情激勵(lì)著他不斷創(chuàng)作圖書和課程,幫助其他人在個(gè)人和職業(yè)領(lǐng)域充分發(fā)揮潛能。疫情期間,我們每周的Zoom 聊天和自助項(xiàng)目確實(shí)對(duì)我很有幫助,使我能保持理智。沒有Matt,就不可能有這本書。
我要感謝Rebecca Novack 建議啟動(dòng)這個(gè)項(xiàng)目,并給了我一個(gè)機(jī)會(huì),還要感謝OReilly 的工作人員讓這個(gè)項(xiàng)目成為現(xiàn)實(shí)。
寫一本書需要付出努力,不過要寫一本好書,還需要有關(guān)心讀者的敬業(yè)的審校人員。我要感謝Mike Drob、Axel Sirota 和Jeff Bleiel 花時(shí)間審閱這本書,并提出了無數(shù)的建議。由于Mike 的建議,我增加了很多原本可能忽略的實(shí)用資源。他確保我們使用最先進(jìn)的工具和最佳實(shí)踐,這是在線文檔中找不到的。Axel 對(duì)細(xì)節(jié)的關(guān)注真是令人難以置信。非常感謝他的鼓勵(lì)和努力,感謝他審閱了本書中的代碼和技術(shù)細(xì)節(jié)。Jeff 是一個(gè)了不起的編輯。非常感謝他對(duì)這本書的順序和組織提出的建議。他的幫助使我成為一個(gè)更好的作者。
PyTorch 是一個(gè)真正的社區(qū)項(xiàng)目。非常感謝Facebook 的人員以及超過1700 位開發(fā)這個(gè)機(jī)器學(xué)習(xí)框架的貢獻(xiàn)者。特別要感謝那些創(chuàng)建文檔和教程的人,這些文檔和教程能幫助像我這樣的人快速學(xué)習(xí)PyTorch。
對(duì)我?guī)椭畲蟮娜税⊿uraj Subramanian、Seth Juarez、Cassie Breviu、Dmitry Soshnikov、Ari Bornstein、Soumith Chintala、Justin Johnson、Jeremy Howard、Rachel Thomas、Francisco Ingham、Sasank Chilamkurthy、Nathan Inkawhich、Sean Robertson、Ben Trevett、Avinash Sajjanshetty、James Reed、Michael Suo、Michela Paganini、Shen Li、Seb Arnold、Rohan Varma、Pritam Damania、Jeff Tang,以及無數(shù)研究PyTorch 主題的博客博主和油管主播。
非常感謝Manbir Gulati 介紹我認(rèn)識(shí)了PyTorch,還要感謝Rob Miller 給我機(jī)會(huì)領(lǐng)導(dǎo)使用PyTorch 完成人工智能項(xiàng)目。很高興與我的朋友Isaac Privitera 分享這本書中的深度學(xué)習(xí)想法。當(dāng)然,如果沒有我母親Grace 的辛勤工作和奉獻(xiàn),我不可能取得任何成就,是她給了我和我哥哥生命,讓我們成長。每天我都很想念她。
特別感謝我的哥哥Vinnie,他對(duì)我的家庭項(xiàng)目提供了很大幫助,讓我有更多的時(shí)間寫作。我要感謝我的繼父Lou,感謝他在我寫這本書時(shí)給予的鼓勵(lì)。還要感謝我的孩子們,Savannah、Caroline 和George,感謝他們?cè)诎职止ぷ鲿r(shí)的耐心和理解。
最后,我要感謝我的妻子Emily。在我的生命里,她一直支持著我的想法和夢(mèng)想。當(dāng)然,當(dāng)我著手寫這本書時(shí),她又一次成為我的依靠。在疫情期間,照顧我們的三個(gè)孩子并承擔(dān)新的責(zé)任實(shí)在是一項(xiàng)艱巨的任務(wù)。
盡管如此,她一直是我完成寫作必不可少的支撐。事實(shí)上,寫這本書的時(shí)候,我們發(fā)現(xiàn)將迎來我們的第四個(gè)孩子!我的妻子總是用微笑和一句玩笑(總是我出錢)迎接一切,這讓我更愛她。
Joe Papa在研究和開發(fā)領(lǐng)域有超過25年的經(jīng)驗(yàn),是TeachMe.AI的創(chuàng)始人。他擁有電機(jī)工程碩士學(xué)位,并在Booz Allen Hamilton和Perspecta Labs領(lǐng)導(dǎo)使用PyTorch的AI研究團(tuán)隊(duì)。Joe指導(dǎo)過成百上千的數(shù)據(jù)科學(xué)家,并在Udemy教過全世界超過6000名學(xué)生。
目錄
前言 . 1
第1 章 PyTorch 簡介 9
1.1 PyTorch 是什么? .9
1.2 為什么使用PyTorch? .10
1.3 新手指南 12
1.3.1 在Google Colaboratory 中運(yùn)行 13
1.3.2 在本地計(jì)算機(jī)上運(yùn)行 .16
1.3.3 在云平臺(tái)上運(yùn)行 17
1.3.4 驗(yàn)證你的PyTorch 環(huán)境 20
1.4 一個(gè)有趣的例子 20
第2 章 張量 29
2.1 張量是什么? .30
2.1.1 簡單CPU 示例 .30
2.1.2 簡單GPU 示例 .31
2.1.3 在CPU 和GPU 之間移動(dòng)張量 .32
2.2 創(chuàng)建張量 33
2.2.1 張量屬性37
2.2.2 數(shù)據(jù)類型38
2.2.3 由隨機(jī)樣本創(chuàng)建張量 .40
2.2.4 創(chuàng)建類似其他張量的張量 42
2.3 張量操作 42
2.3.1 張量索引、切片、合并和拆分 .43
2.3.2 張量數(shù)學(xué)運(yùn)算 47
2.3.3 自動(dòng)微分(Autograd) .54
第3 章 使用PyTorch 的深度學(xué)習(xí)開發(fā) . 57
3.1 完整過程 58
3.2 數(shù)據(jù)準(zhǔn)備 60
3.2.1 數(shù)據(jù)加載60
3.2.2 數(shù)據(jù)變換65
3.2.3 數(shù)據(jù)批處理 .69
3.2.4 一般數(shù)據(jù)準(zhǔn)備(torch.utils.data) 70
3.3 模型開發(fā) 74
3.3.1 模型設(shè)計(jì)75
3.3.2 訓(xùn)練 90
3.3.3 驗(yàn)證 98
3.3.4 測(cè)試 .102
3.4 模型部署 .103
3.4.1 保存模型104
3.4.2 部署到PyTorch Hub 105
3.4.3 部署到生產(chǎn)環(huán)境 106
第4 章 神經(jīng)網(wǎng)絡(luò)開發(fā)參考設(shè)計(jì) 107
4.1 使用遷移學(xué)習(xí)完成圖像分類 .108
4.1.1 數(shù)據(jù)處理108
4.1.2 模型設(shè)計(jì) 111
4.1.3 訓(xùn)練和驗(yàn)證 113
4.1.4 測(cè)試和部署 115
4.2 用Torchtext 完成情感分析 117
4.2.1 數(shù)據(jù)處理 117
4.2.2 模型設(shè)計(jì)123
4.2.3 訓(xùn)練和驗(yàn)證 125
4.2.4 測(cè)試和部署 127
4.3 生成式學(xué)習(xí)用DCGAN 生成Fashion-MNIST 圖像 129
4.3.1 數(shù)據(jù)處理130
4.3.2 模型設(shè)計(jì)132
4.3.3 訓(xùn)練 .135
4.3.4 測(cè)試和部署 140
第5 章 定制PyTorch 143
5.1 定制層和激活函數(shù) .144
5.1.1 定制層示例(Complex Linear) 146
5.1.2 定制激活示例(Complex ReLU) 150
5.2 定制模型架構(gòu) 151
5.3 定制損失函數(shù) 154
5.4 定制優(yōu)化器算法 .156
5.5 定制訓(xùn)練、驗(yàn)證和測(cè)試循環(huán) .160
第6 章 PyTorch 加速和優(yōu)化 . 165
6.1 TPU 上使用PyTorch 166
6.2 (單機(jī))多個(gè)GPU 上使用PyTorch .170
6.2.1 數(shù)據(jù)并行處理 .170
6.2.2 模型并行處理 .175
6.2.3 結(jié)合數(shù)據(jù)并行處理和模型并行處理.177
6.3 (多機(jī))分布式訓(xùn)練 180
6.4 模型優(yōu)化 .182
6.4.1 超參數(shù)調(diào)優(yōu) 182
6.4.2 量化 .190
6.4.3 剪枝 .194
第7 章 PyTorch 部署到生產(chǎn)環(huán)境 201
7.1 PyTorch 部署工具和庫 202
7.1.1 通用示例模型 .203
7.1.2 Python API 204
7.1.3 TorchScript 205
7.1.4 TorchServe 209
7.1.5 ONNX .218
7.1.6 Mobile 庫 219
7.2 部署到Flask 應(yīng)用 221
7.3 Colab Flask 應(yīng)用 .224
7.4 用TorchServe 部署到云227
7.5 Docker 快速入門.227
7.6 部署到移動(dòng)和邊緣設(shè)備 229
7.6.1 iOS229
7.6.2 Android 232
7.6.3 其他邊緣設(shè)備 .236
第8 章 PyTorch 生態(tài)系統(tǒng)和其他資源 239
8.1 PyTorch 生態(tài)系統(tǒng) 240
8.2 面向圖像和視頻的Torchvision 248
8.2.1 數(shù)據(jù)集和I/O249
8.2.2 模型 .251
8.2.3 變換、操作和實(shí)用工具 .253
8.3 用于NLP 的Torchtext 261
8.3.1 創(chuàng)建一個(gè)數(shù)據(jù)集對(duì)象 261
8.3.2 預(yù)處理數(shù)據(jù) 262
8.3.3 創(chuàng)建一個(gè)Dataloader 批處理 263
8.3.4 數(shù)據(jù)(torchtext.data) 264
8.3.5 數(shù)據(jù)集(torchtext.datasets) 265
8.3.6 詞匯表(torchtext.vocab) 268
8.4 用于可視化的TensorBoard 269
8.4.1 SCALARS 顯示學(xué)習(xí)曲線 .272
8.4.2 GRAPHS 顯示模型架構(gòu) 273
8.4.3 IMAGES、TEXT 和PROJECTOR 顯示數(shù)據(jù) .274
8.4.4 DISTRIBUTIONS 和HISTOGRAMS 顯示權(quán)重分布 .275
8.4.5 HPARAMS 顯示超參數(shù) .276
8.4.6 TensorBoard API 277
8.5 Papers with Code 280
8.6 其他PyTorch 資源 .280
8.6.1 教程 .281
8.6.2 圖書 .283
8.6.3 在線課程和現(xiàn)場(chǎng)培訓(xùn) 284