為什么寫這本書
在人工智能時代,如何盡快掌握人工智能的核心深度學(xué)習(xí),是每個欲進(jìn)入該領(lǐng)域的人都會面臨的問題。目前,深度學(xué)習(xí)框架很多,如TensorFlow、PyTorch、Keras、FastAI、CNTK等,這些框架各有優(yōu)缺點(diǎn),應(yīng)該如何選擇?是否有一些標(biāo)準(zhǔn)?我認(rèn)為,適合自己的就是最好的。
如果你是一位初學(xué)者,建議選擇PyTorch,有了一定的基礎(chǔ)之后,可以學(xué)習(xí)其他一些架構(gòu),如TensorFlow、CNTK等。建議初學(xué)者選擇PyTorch的主要依據(jù)是:
1)PyTorch是動態(tài)計算圖,其用法更貼近Python,并且,PyTorch與Python共用了許多Numpy的命令,可以降低學(xué)習(xí)的門檻,比TensorFlow更容易上手。
2)PyTorch需要定義網(wǎng)絡(luò)層、參數(shù)更新等關(guān)鍵步驟,這非常有助于理解深度學(xué)習(xí)的核心;而Keras雖然也非常簡單,且容易上手,但封裝粒度很粗,隱藏了很多關(guān)鍵步驟。
3)PyTorch的動態(tài)圖機(jī)制在調(diào)試方面非常方便,如果計算圖運(yùn)行出錯,馬上可以跟蹤問題。PyTorch的調(diào)試與Python的調(diào)試一樣,通過斷點(diǎn)檢查就可以高效解決問題。
4)PyTorch的流行度僅次于TensorFlow。而最近一年,在GitHub關(guān)注度和貢獻(xiàn)者的增長方面,PyTorch跟TensorFlow基本持平。PyTorch的搜索熱度持續(xù)上漲,加上FastAI的支持,PyTorch將受到越來越多機(jī)器學(xué)習(xí)從業(yè)者的青睞。
深度學(xué)習(xí)是人工智能的核心,隨著大量相關(guān)項(xiàng)目的落地,人們對深度學(xué)習(xí)的興趣也持續(xù)上升。不過掌握深度學(xué)習(xí)卻不是一件輕松的事情,尤其是對機(jī)器學(xué)習(xí)或深度學(xué)習(xí)的初學(xué)者來說,挑戰(zhàn)更多。為了廣大人工智能初學(xué)者或愛好者能在較短時間內(nèi)掌握深度學(xué)習(xí)基礎(chǔ)及利用PyTorch解決深度學(xué)習(xí)問題,我們花了近一年時間打磨這本書,在內(nèi)容選擇、安排和組織等方面采用了如下方法。
(1)內(nèi)容選擇:廣泛涉獵 精講 注重實(shí)戰(zhàn)
深度學(xué)習(xí)涉及面比較廣,且有一定門檻。沒有一定廣度很難達(dá)到一定深度,所以本書內(nèi)容基本包括了機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的主要內(nèi)容。書中各章一般先簡單介紹相應(yīng)的架構(gòu)或原理,幫助讀者理解深度學(xué)習(xí)的本質(zhì)。當(dāng)然,如果只有概念、框架、原理、數(shù)學(xué)公式的介紹,可能就顯得有點(diǎn)抽象或乏味,所以,每章都配有大量實(shí)踐案例,通過實(shí)例有利于加深對原理和公式的理解,同時有利于把相關(guān)內(nèi)容融會貫通。
(2)內(nèi)容安排:簡單實(shí)例開始 循序漸進(jìn)
深度學(xué)習(xí)是一塊難啃的硬骨頭,對有一定開發(fā)經(jīng)驗(yàn)和數(shù)學(xué)基礎(chǔ)的從業(yè)者是這樣,對初學(xué)者更是如此。其中卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、對抗式神經(jīng)網(wǎng)絡(luò)是深度學(xué)習(xí)的基石,同時也是深度學(xué)習(xí)的3大硬骨頭。為了讓讀者更好地理解掌握這些網(wǎng)絡(luò),我們采用循序漸進(jìn)的方式,先從簡單特例開始,然后逐步介紹更一般性的內(nèi)容,最后通過一些PyTorch代碼實(shí)例實(shí)現(xiàn)之,整本書的結(jié)構(gòu)及各章節(jié)內(nèi)容安排都遵循這個原則。此外,一些優(yōu)化方法也采用這種方法,如對數(shù)據(jù)集Cifar10分類優(yōu)化,先用一般卷積神經(jīng)網(wǎng)絡(luò),然后使用集成方法、現(xiàn)代經(jīng)典網(wǎng)絡(luò),最后采用數(shù)據(jù)增加和遷移方法,使得模型精度不斷提升,由最初的68%,上升到74%和90%,最后達(dá)到95%左右。
(3)表達(dá)形式:讓圖說話,一張好圖勝過千言萬語
在機(jī)器學(xué)習(xí)、深度學(xué)習(xí)中有很多抽象的概念、復(fù)雜的算法、深奧的理論等,如Numpy的廣播機(jī)制、梯度下降對學(xué)習(xí)率敏感、神經(jīng)網(wǎng)絡(luò)中的共享參數(shù)、動量優(yōu)化法、梯度消失或爆炸等,這些內(nèi)容如果只用文字來描述,可能很難達(dá)到使讀者茅塞頓開的效果,但如果用一些圖形來展現(xiàn),再加上適當(dāng)?shù)奈淖终f明,往往能取得非常好的效果,正所謂一張好圖勝過千言萬語。
除了以上談到的3個方面,為了幫助大家更好理解、更快掌握機(jī)器學(xué)習(xí)、深度學(xué)習(xí)這些人工智能的核心內(nèi)容,本書還包含了其他方法。我們希望通過這些方法方式帶給你不一樣的理解和體驗(yàn),使抽象數(shù)學(xué)不抽象、深度學(xué)習(xí)不深奧、復(fù)雜算法不復(fù)雜、難學(xué)的深度學(xué)習(xí)也易學(xué),這也是我們寫這本書的主要目的。
至于人工智能(AI)的重要性,我想就不用多說了。如果說2016年前屬于擺事實(shí)論證的階段,2017年和2018年是事實(shí)勝于雄辯的階段,那么2019年及以后就進(jìn)入百舸爭流、奮楫者先的階段。目前各行各業(yè)都忙于AI ,大家都希望通過AI來改造傳統(tǒng)流程、傳統(tǒng)結(jié)構(gòu)、傳統(tǒng)業(yè)務(wù)、傳統(tǒng)架構(gòu),其效果猶如歷史上用電改造原有的各行各業(yè)一樣。
前言
第一部分 PyTorch基礎(chǔ)
第1章 Numpy基礎(chǔ)2
1.1 生成Numpy數(shù)組3
1.1.1 從已有數(shù)據(jù)中創(chuàng)建數(shù)組3
1.1.2 利用random模塊生成數(shù)組4
1.1.3 創(chuàng)建特定形狀的多維數(shù)組5
1.1.4 利用arange、linspace函數(shù)生成數(shù)組6
1.2 獲取元素7
1.3 Numpy的算術(shù)運(yùn)算9
1.3.1 對應(yīng)元素相乘9
1.3.2 點(diǎn)積運(yùn)算10
1.4 數(shù)組變形11
1.4.1 更改數(shù)組的形狀11
1.4.2 合并數(shù)組14
1.5 批量處理16
1.6 通用函數(shù)17
1.7 廣播機(jī)制19
1.8 小結(jié)20
第2章 PyTorch基礎(chǔ)21
2.1 為何選擇PyTorch?21
2.2 安裝配置22
2.2.1 安裝CPU版PyTorch22
2.2.2 安裝GPU版PyTorch24
2.3 Jupyter Notebook環(huán)境配置26
2.4 Numpy與Tensor28
2.4.1 Tensor概述28
2.4.2 創(chuàng)建Tensor28
2.4.3 修改Tensor形狀30
2.4.4 索引操作31
2.4.5 廣播機(jī)制32
2.4.6 逐元素操作32
2.4.7 歸并操作33
2.4.8 比較操作34
2.4.9 矩陣操作35
2.4.10 PyTorch與Numpy比較35
2.5 Tensor與Autograd36
2.5.1 自動求導(dǎo)要點(diǎn)36
2.5.2 計算圖37
2.5.3 標(biāo)量反向傳播38
2.5.4 非標(biāo)量反向傳播39
2.6 使用Numpy實(shí)現(xiàn)機(jī)器學(xué)習(xí)41
2.7 使用Tensor及Antograd實(shí)現(xiàn)機(jī)器學(xué)習(xí)44
2.8 使用TensorFlow架構(gòu)46
2.9 小結(jié)48
第3章 PyTorch神經(jīng)網(wǎng)絡(luò)工具箱49
3.1 神經(jīng)網(wǎng)絡(luò)核心組件49
3.2 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)實(shí)例50
3.2.1 背景說明51
3.2.2 準(zhǔn)備數(shù)據(jù)52
3.2.3 可視化源數(shù)據(jù)53
3.2.4 構(gòu)建模型53
3.2.5 訓(xùn)練模型54
3.3 如何構(gòu)建神經(jīng)網(wǎng)絡(luò)?56
3.3.1 構(gòu)建網(wǎng)絡(luò)層56
3.3.2 前向傳播57
3.3.3 反向傳播57
3.3.4 訓(xùn)練模型58
3.4 神經(jīng)網(wǎng)絡(luò)工具箱nn58
3.4.1 nn.Module58
3.4.2 nn.functional58
3.5 優(yōu)化器59
3.6 動態(tài)修改學(xué)習(xí)率參數(shù)60
3.7 優(yōu)化器比較60
3.8 小結(jié)62
第4章 PyTorch數(shù)據(jù)處理工具箱63
4.1 數(shù)據(jù)處理工具箱概述63
4.2 utils.data簡介64
4.3 torchvision簡介66
4.3.1 transforms67
4.3.2 ImageFolder67
4.4 可視化工具69
4.4.1 tensorboardX簡介69
4.4.2 用tensorboardX可視化神經(jīng)網(wǎng)絡(luò)71
4.4.3 用tensorboardX可視化損失值72
4.4.4 用tensorboardX可視化特征圖73
4.5 本章小結(jié)74
第二部分 深度學(xué)習(xí)基礎(chǔ)
第5章 機(jī)器學(xué)習(xí)基礎(chǔ)76
5.1 機(jī)器學(xué)習(xí)的基本任務(wù)76
5.1.1 監(jiān)督學(xué)習(xí)77
5.1.2 無監(jiān)督學(xué)習(xí)77
5.1.3 半監(jiān)督學(xué)習(xí)78
5.1.4 強(qiáng)化學(xué)習(xí)78
5.2 機(jī)器學(xué)習(xí)一般流程78
5.2.1 明確目標(biāo)79
5.2.2 收集數(shù)據(jù)79
5.2.3 數(shù)據(jù)探索與預(yù)處理79
5.2.4 選擇模型及損失函數(shù)80
5.2.5 評估及優(yōu)化模型81
5.3 過擬合與欠擬合81
5.3.1 權(quán)重正則化82
5.3.2 Dropout正則化83
5.3.3 批量正則化86
5.3.4 權(quán)重初始化88
5.4 選擇合適激活函數(shù)89
5.5 選擇合適的損失函數(shù)90
5.6 選擇合適優(yōu)化器92
5.6.1 傳統(tǒng)梯度優(yōu)化的不足93
5.6.2 動量算法94
5.6.3 AdaGrad算法96
5.6.4 RMSProp算法97
5.6.5 Adam算法98
5.7 GPU加速99
5.7.1 單GPU加速100
5.7.2 多GPU加速101
5.7.3 使用GPU注意事項(xiàng)104
5.8 本章小結(jié)104
第6章 視覺處理基礎(chǔ)105
6.1 卷積神經(jīng)網(wǎng)絡(luò)簡介105
6.2 卷積層107
6.2.1 卷積核108
6.2.2 步幅109
6.2.3 填充111
6.2.4 多通道上的卷積111
6.2.5 激活函數(shù)113
6.2.6 卷積函數(shù)113
6.2.7 轉(zhuǎn)置卷積114
6.3 池化層115
6.3.1 局部池化116
6.3.2 全局池化117
6.4 現(xiàn)代經(jīng)典網(wǎng)絡(luò)119
6.4.1 LeNet-5模型119
6.4.2 AlexNet模型120
6.4.3 VGG模型121
6.4.4 GoogleNet模型122
6.4.5 ResNet模型123
6.4.6 膠囊網(wǎng)絡(luò)簡介124
6.5 PyTorch實(shí)現(xiàn)CIFAR-10多分類125
6.5.1 數(shù)據(jù)集說明125
6.5.2 加載數(shù)據(jù)125
6.5.3 構(gòu)建網(wǎng)絡(luò)127
6.5.4 訓(xùn)練模型128
6.5.5 測試模型129
6.5.6 采用全局平均池化130
6.5.7 像Keras一樣顯示各層參數(shù)131
6.6 模型集成提升性能133
6.6.1 使用模型134
6.6.2 集成方法134
6.6.3 集成效果135
6.7 使用現(xiàn)代經(jīng)典模型提升性能136
6.8 本章小結(jié)137
第7章 自然語言處理基礎(chǔ)138
7.1 循環(huán)神經(jīng)網(wǎng)絡(luò)基本結(jié)構(gòu)138
7.2 前向傳播與隨時間反向傳播140
7.3 循環(huán)神經(jīng)網(wǎng)絡(luò)變種143
7.3.1 LSTM144
7.3.2 GRU145
7.3.3 Bi-RNN146
7.4 循環(huán)神經(jīng)網(wǎng)絡(luò)的PyTorch實(shí)現(xiàn)146
7.4.1 RNN實(shí)現(xiàn)147
7.4.2 LSTM實(shí)現(xiàn)149
7.4.3 GRU實(shí)現(xiàn)151
7.5 文本數(shù)據(jù)處理152
7.6 詞嵌入153
7.6.1 Word2Vec原理154
7.6.2 CBOW模型155
7.6.3 Skip-Gram模型155
7.7 PyTorch實(shí)現(xiàn)詞性判別156
7.7.1 詞性判別主要步驟156
7.7.2 數(shù)據(jù)預(yù)處理157
7.7.3 構(gòu)建網(wǎng)絡(luò)157
7.7.4 訓(xùn)練網(wǎng)絡(luò)158
7.7.5 測試模型160
7.8 用LSTM預(yù)測股票行情160
7.8.1 導(dǎo)入數(shù)據(jù)160
7.8.2 數(shù)據(jù)概覽161
7.8.3 預(yù)處理數(shù)據(jù)162
7.8.4 定義模型163
7.8.5 訓(xùn)練模型163
7.8.6 測試模型164
7.9 循環(huán)神經(jīng)網(wǎng)絡(luò)應(yīng)用場景165
7.10 小結(jié)166
第8章 生成式深度學(xué)習(xí)167
8.1 用變分自編碼器生成圖像167
8.1.1 自編碼器168
8.1.2 變分自編碼器168
8.1.3 用變分自編碼器生成圖像169
8.2 GAN簡介173
8.2.1 GAN架構(gòu)173
8.2.2 GAN的損失函數(shù)174
8.3 用GAN生成圖像175
8.3.1 判別器175
8.3.2 生成器175
8.3.3 訓(xùn)練模型175
8.3.4 可視化結(jié)果177
8.4 VAE與GAN的優(yōu)缺點(diǎn)178
8.5 ConditionGAN179
8.5.1 CGAN的架構(gòu)179
8.5.2 CGAN生成器180
8.5.3 CGAN判別器180
8.5.4 CGAN損失函數(shù)181
8.5.5 CGAN可視化181
8.5.6 查看指定標(biāo)簽的數(shù)據(jù)182
8.5.7 可視化損失值182
8.6 DCGAN183
8.7 提升GAN訓(xùn)練效果的一些技巧184
8.8 小結(jié)185
第三部分 深度學(xué)習(xí)實(shí)踐
第9章 人臉檢測與識別188
9.1 人臉識別一般流程188
9.2 人臉檢測189
9.2.1 目標(biāo)檢測189
9.2.2 人臉定位191
9.2.3 人臉對齊191
9.2.4 MTCNN算法192
9.3 特征提取193
9.4 人臉識別198
9.4.1 人臉識別主要原理198
9.4.2 人臉識別發(fā)展198
9.5 PyTorch實(shí)現(xiàn)人臉檢測與識別199
9.5.1 驗(yàn)證檢測代碼199
9.5.2 檢測圖像200
9.5.3 檢測后進(jìn)行預(yù)處理200
9.5.4 查看經(jīng)檢測后的圖像201
9.5.5 人臉識別202
9.6 小結(jié)202
第10章 遷移學(xué)習(xí)實(shí)例203
10.1 遷移學(xué)習(xí)簡介203
10.2 特征提取204
10.2.1 PyTorch提供的預(yù)處理模塊205
10.2.2 特征提取實(shí)例206
10.3 數(shù)據(jù)增強(qiáng)209
10.3.1 按比例縮放209
10.3.2 裁剪210
10.3.3 翻轉(zhuǎn)210
10.3.4 改變顏色211
10.3.5 組合多種增強(qiáng)方法211
10.4 微調(diào)實(shí)例212
10.4.1 數(shù)據(jù)預(yù)處理212
10.4.2 加載預(yù)訓(xùn)練模型213
10.4.3 修改分類器213
10.4.4 選擇損失函數(shù)及優(yōu)化器213
10.4.5 訓(xùn)練及驗(yàn)證模型214
10.5 清除圖像中的霧霾214
10.6 小結(jié)217
第11章 神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯實(shí)例218
11.1 Encoder-Decoder模型原理218
11.2 注意力框架220
11.3 PyTorch實(shí)現(xiàn)注意力Decoder224
11.3.1 構(gòu)建Encoder224
11.3.2 構(gòu)建簡單Decoder225
11.3.3 構(gòu)建注意力Decoder226
11.4 用注意力機(jī)制實(shí)現(xiàn)中英文互譯227
11.4.1 導(dǎo)入需要的模塊228
11.4.2 數(shù)據(jù)預(yù)處理228
11.4.3 構(gòu)建模型231
11.4.4 訓(xùn)練模型234
11.4.5 隨機(jī)采樣,對模型進(jìn)行測試235
11.4.6 可視化注意力236
11.5 小結(jié)237
第12章 實(shí)戰(zhàn)生成式模型238
12.1 DeepDream模型238
12.1.1 Deep Dream原理238
12.1.2 DeepDream算法流程239
12.1.3 用PyTorch實(shí)現(xiàn)Deep Dream240
12.2 風(fēng)格遷移243
12.2.1 內(nèi)容損失244
12.2.2 風(fēng)格損失245
12.2.3 用PyTorch實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)風(fēng)格遷移247
12.3 PyTorch實(shí)現(xiàn)圖像修復(fù)252
12.3.1 網(wǎng)絡(luò)結(jié)構(gòu)252
12.3.2 損失函數(shù)252
12.3.3 圖像修復(fù)實(shí)例253
12.4 PyTorch實(shí)現(xiàn)DiscoGAN255
12.4.1 DiscoGAN架構(gòu)256
12.4.2 損失函數(shù)258
12.4.3 DiscoGAN實(shí)現(xiàn)258
12.4.4 用PyTorch實(shí)現(xiàn)從邊框生成鞋子260
12.5 小結(jié)262
第13章 Caffe2模型遷移實(shí)例263
13.1 Caffe2簡介263
13.2 Caffe如何升級到Caffe2264
13.3 PyTorch如何遷移到Caffe2265
13.4 小結(jié)268
第14章 AI新方向:對抗攻擊269
14.1 對抗攻擊簡介269
14.1.1 白盒攻擊與黑盒攻擊270
14.1.2 無目標(biāo)攻擊與有目標(biāo)攻擊270
14.2 常見對抗樣本生成方式271
14.2.1 快速梯度符號法271
14.2.2 快速梯度算法271
14.3 PyTorch實(shí)現(xiàn)對抗攻擊272
14.3.1 實(shí)現(xiàn)無目標(biāo)攻擊272
14.3.2 實(shí)現(xiàn)有目標(biāo)攻擊274
14.4 對抗攻擊和防御措施276
14.4.1 對抗攻擊276
14.4.2 常見防御方法分類276
14.5 總結(jié)277
第15章 強(qiáng)化學(xué)習(xí)278
15.1 強(qiáng)化學(xué)習(xí)簡介278
15.2 Q-Learning原理281
15.2.1 Q-Learning主要流程281
15.2.2 Q函數(shù)282
15.2.3 貪婪策略283
15.3 用PyTorch實(shí)現(xiàn)Q-Learning283
15.3.1 定義Q-Learing主函數(shù)283
15.3.2 執(zhí)行Q-Learing284
15.4 SARSA算法285
15.4.1 SARSA算法主要步驟285
15.4.2 用PyTorch實(shí)現(xiàn)SARSA算法286
15.5 小結(jié)287
第16章 深度強(qiáng)化學(xué)習(xí)288
16.1 DQN算法原理288
16.1.1 Q-Learning方法的局限性289
16.1.2 用DL處理RL需要解決的問題289
16.1.3 用DQN解決方法289
16.1.4 定義損失函數(shù)290
16.1.5 DQN的經(jīng)驗(yàn)回放機(jī)制290
16.1.6 目標(biāo)網(wǎng)絡(luò)290
16.1.7 網(wǎng)絡(luò)模型291
16.1.8 DQN算法291
16.2 用PyTorch實(shí)現(xiàn)DQN算法292
16.3 小結(jié)295
附錄A PyTorch0.4版本變更296
附錄B AI在各行業(yè)的最新應(yīng)用301