為什么寫這本書
在人工智能時代,如何盡快掌握人工智能的核心深度學習,是每個欲進入該領域的人都會面臨的問題。目前,深度學習框架很多,如TensorFlow、PyTorch、Keras、FastAI、CNTK等,這些框架各有優(yōu)缺點,應該如何選擇?是否有一些標準?我認為,適合自己的就是最好的。
如果你是一位初學者,建議選擇PyTorch,有了一定的基礎之后,可以學習其他一些架構,如TensorFlow、CNTK等。建議初學者選擇PyTorch的主要依據(jù)是:
1)PyTorch是動態(tài)計算圖,其用法更貼近Python,并且,PyTorch與Python共用了許多Numpy的命令,可以降低學習的門檻,比TensorFlow更容易上手。
2)PyTorch需要定義網(wǎng)絡層、參數(shù)更新等關鍵步驟,這非常有助于理解深度學習的核心;而Keras雖然也非常簡單,且容易上手,但封裝粒度很粗,隱藏了很多關鍵步驟。
3)PyTorch的動態(tài)圖機制在調試方面非常方便,如果計算圖運行出錯,馬上可以跟蹤問題。PyTorch的調試與Python的調試一樣,通過斷點檢查就可以高效解決問題。
4)PyTorch的流行度僅次于TensorFlow。而最近一年,在GitHub關注度和貢獻者的增長方面,PyTorch跟TensorFlow基本持平。PyTorch的搜索熱度持續(xù)上漲,加上FastAI的支持,PyTorch將受到越來越多機器學習從業(yè)者的青睞。
深度學習是人工智能的核心,隨著大量相關項目的落地,人們對深度學習的興趣也持續(xù)上升。不過掌握深度學習卻不是一件輕松的事情,尤其是對機器學習或深度學習的初學者來說,挑戰(zhàn)更多。為了廣大人工智能初學者或愛好者能在較短時間內掌握深度學習基礎及利用PyTorch解決深度學習問題,我們花了近一年時間打磨這本書,在內容選擇、安排和組織等方面采用了如下方法。
(1)內容選擇:廣泛涉獵 精講 注重實戰(zhàn)
深度學習涉及面比較廣,且有一定門檻。沒有一定廣度很難達到一定深度,所以本書內容基本包括了機器學習、深度學習的主要內容。書中各章一般先簡單介紹相應的架構或原理,幫助讀者理解深度學習的本質。當然,如果只有概念、框架、原理、數(shù)學公式的介紹,可能就顯得有點抽象或乏味,所以,每章都配有大量實踐案例,通過實例有利于加深對原理和公式的理解,同時有利于把相關內容融會貫通。
(2)內容安排:簡單實例開始 循序漸進
深度學習是一塊難啃的硬骨頭,對有一定開發(fā)經(jīng)驗和數(shù)學基礎的從業(yè)者是這樣,對初學者更是如此。其中卷積神經(jīng)網(wǎng)絡、循環(huán)神經(jīng)網(wǎng)絡、對抗式神經(jīng)網(wǎng)絡是深度學習的基石,同時也是深度學習的3大硬骨頭。為了讓讀者更好地理解掌握這些網(wǎng)絡,我們采用循序漸進的方式,先從簡單特例開始,然后逐步介紹更一般性的內容,最后通過一些PyTorch代碼實例實現(xiàn)之,整本書的結構及各章節(jié)內容安排都遵循這個原則。此外,一些優(yōu)化方法也采用這種方法,如對數(shù)據(jù)集Cifar10分類優(yōu)化,先用一般卷積神經(jīng)網(wǎng)絡,然后使用集成方法、現(xiàn)代經(jīng)典網(wǎng)絡,最后采用數(shù)據(jù)增加和遷移方法,使得模型精度不斷提升,由最初的68%,上升到74%和90%,最后達到95%左右。
(3)表達形式:讓圖說話,一張好圖勝過千言萬語
在機器學習、深度學習中有很多抽象的概念、復雜的算法、深奧的理論等,如Numpy的廣播機制、梯度下降對學習率敏感、神經(jīng)網(wǎng)絡中的共享參數(shù)、動量優(yōu)化法、梯度消失或爆炸等,這些內容如果只用文字來描述,可能很難達到使讀者茅塞頓開的效果,但如果用一些圖形來展現(xiàn),再加上適當?shù)奈淖终f明,往往能取得非常好的效果,正所謂一張好圖勝過千言萬語。
除了以上談到的3個方面,為了幫助大家更好理解、更快掌握機器學習、深度學習這些人工智能的核心內容,本書還包含了其他方法。我們希望通過這些方法方式帶給你不一樣的理解和體驗,使抽象數(shù)學不抽象、深度學習不深奧、復雜算法不復雜、難學的深度學習也易學,這也是我們寫這本書的主要目的。
至于人工智能(AI)的重要性,我想就不用多說了。如果說2016年前屬于擺事實論證的階段,2017年和2018年是事實勝于雄辯的階段,那么2019年及以后就進入百舸爭流、奮楫者先的階段。目前各行各業(yè)都忙于AI ,大家都希望通過AI來改造傳統(tǒng)流程、傳統(tǒng)結構、傳統(tǒng)業(yè)務、傳統(tǒng)架構,其效果猶如歷史上用電改造原有的各行各業(yè)一樣。
前言
第一部分 PyTorch基礎
第1章 Numpy基礎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的算術運算9
1.3.1 對應元素相乘9
1.3.2 點積運算10
1.4 數(shù)組變形11
1.4.1 更改數(shù)組的形狀11
1.4.2 合并數(shù)組14
1.5 批量處理16
1.6 通用函數(shù)17
1.7 廣播機制19
1.8 小結20
第2章 PyTorch基礎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 廣播機制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 自動求導要點36
2.5.2 計算圖37
2.5.3 標量反向傳播38
2.5.4 非標量反向傳播39
2.6 使用Numpy實現(xiàn)機器學習41
2.7 使用Tensor及Antograd實現(xiàn)機器學習44
2.8 使用TensorFlow架構46
2.9 小結48
第3章 PyTorch神經(jīng)網(wǎng)絡工具箱49
3.1 神經(jīng)網(wǎng)絡核心組件49
3.2 實現(xiàn)神經(jīng)網(wǎng)絡實例50
3.2.1 背景說明51
3.2.2 準備數(shù)據(jù)52
3.2.3 可視化源數(shù)據(jù)53
3.2.4 構建模型53
3.2.5 訓練模型54
3.3 如何構建神經(jīng)網(wǎng)絡?56
3.3.1 構建網(wǎng)絡層56
3.3.2 前向傳播57
3.3.3 反向傳播57
3.3.4 訓練模型58
3.4 神經(jīng)網(wǎng)絡工具箱nn58
3.4.1 nn.Module58
3.4.2 nn.functional58
3.5 優(yōu)化器59
3.6 動態(tài)修改學習率參數(shù)60
3.7 優(yōu)化器比較60
3.8 小結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)絡71
4.4.3 用tensorboardX可視化損失值72
4.4.4 用tensorboardX可視化特征圖73
4.5 本章小結74
第二部分 深度學習基礎
第5章 機器學習基礎76
5.1 機器學習的基本任務76
5.1.1 監(jiān)督學習77
5.1.2 無監(jiān)督學習77
5.1.3 半監(jiān)督學習78
5.1.4 強化學習78
5.2 機器學習一般流程78
5.2.1 明確目標79
5.2.2 收集數(shù)據(jù)79
5.2.3 數(shù)據(jù)探索與預處理79
5.2.4 選擇模型及損失函數(shù)80
5.2.5 評估及優(yōu)化模型81
5.3 過擬合與欠擬合81
5.3.1 權重正則化82
5.3.2 Dropout正則化83
5.3.3 批量正則化86
5.3.4 權重初始化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注意事項104
5.8 本章小結104
第6章 視覺處理基礎105
6.1 卷積神經(jīng)網(wǎng)絡簡介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 轉置卷積114
6.3 池化層115
6.3.1 局部池化116
6.3.2 全局池化117
6.4 現(xiàn)代經(jīng)典網(wǎng)絡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)絡簡介124
6.5 PyTorch實現(xiàn)CIFAR-10多分類125
6.5.1 數(shù)據(jù)集說明125
6.5.2 加載數(shù)據(jù)125
6.5.3 構建網(wǎng)絡127
6.5.4 訓練模型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 本章小結137
第7章 自然語言處理基礎138
7.1 循環(huán)神經(jīng)網(wǎng)絡基本結構138
7.2 前向傳播與隨時間反向傳播140
7.3 循環(huán)神經(jīng)網(wǎng)絡變種143
7.3.1 LSTM144
7.3.2 GRU145
7.3.3 Bi-RNN146
7.4 循環(huán)神經(jīng)網(wǎng)絡的PyTorch實現(xiàn)146
7.4.1 RNN實現(xiàn)147
7.4.2 LSTM實現(xiàn)149
7.4.3 GRU實現(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實現(xiàn)詞性判別156
7.7.1 詞性判別主要步驟156
7.7.2 數(shù)據(jù)預處理157
7.7.3 構建網(wǎng)絡157
7.7.4 訓練網(wǎng)絡158
7.7.5 測試模型160
7.8 用LSTM預測股票行情160
7.8.1 導入數(shù)據(jù)160
7.8.2 數(shù)據(jù)概覽161
7.8.3 預處理數(shù)據(jù)162
7.8.4 定義模型163
7.8.5 訓練模型163
7.8.6 測試模型164
7.9 循環(huán)神經(jīng)網(wǎng)絡應用場景165
7.10 小結166
第8章 生成式深度學習167
8.1 用變分自編碼器生成圖像167
8.1.1 自編碼器168
8.1.2 變分自編碼器168
8.1.3 用變分自編碼器生成圖像169
8.2 GAN簡介173
8.2.1 GAN架構173
8.2.2 GAN的損失函數(shù)174
8.3 用GAN生成圖像175
8.3.1 判別器175
8.3.2 生成器175
8.3.3 訓練模型175
8.3.4 可視化結果177
8.4 VAE與GAN的優(yōu)缺點178
8.5 ConditionGAN179
8.5.1 CGAN的架構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 查看指定標簽的數(shù)據(jù)182
8.5.7 可視化損失值182
8.6 DCGAN183
8.7 提升GAN訓練效果的一些技巧184
8.8 小結185
第三部分 深度學習實踐
第9章 人臉檢測與識別188
9.1 人臉識別一般流程188
9.2 人臉檢測189
9.2.1 目標檢測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實現(xiàn)人臉檢測與識別199
9.5.1 驗證檢測代碼199
9.5.2 檢測圖像200
9.5.3 檢測后進行預處理200
9.5.4 查看經(jīng)檢測后的圖像201
9.5.5 人臉識別202
9.6 小結202
第10章 遷移學習實例203
10.1 遷移學習簡介203
10.2 特征提取204
10.2.1 PyTorch提供的預處理模塊205
10.2.2 特征提取實例206
10.3 數(shù)據(jù)增強209
10.3.1 按比例縮放209
10.3.2 裁剪210
10.3.3 翻轉210
10.3.4 改變顏色211
10.3.5 組合多種增強方法211
10.4 微調實例212
10.4.1 數(shù)據(jù)預處理212
10.4.2 加載預訓練模型213
10.4.3 修改分類器213
10.4.4 選擇損失函數(shù)及優(yōu)化器213
10.4.5 訓練及驗證模型214
10.5 清除圖像中的霧霾214
10.6 小結217
第11章 神經(jīng)網(wǎng)絡機器翻譯實例218
11.1 Encoder-Decoder模型原理218
11.2 注意力框架220
11.3 PyTorch實現(xiàn)注意力Decoder224
11.3.1 構建Encoder224
11.3.2 構建簡單Decoder225
11.3.3 構建注意力Decoder226
11.4 用注意力機制實現(xiàn)中英文互譯227
11.4.1 導入需要的模塊228
11.4.2 數(shù)據(jù)預處理228
11.4.3 構建模型231
11.4.4 訓練模型234
11.4.5 隨機采樣,對模型進行測試235
11.4.6 可視化注意力236
11.5 小結237
第12章 實戰(zhàn)生成式模型238
12.1 DeepDream模型238
12.1.1 Deep Dream原理238
12.1.2 DeepDream算法流程239
12.1.3 用PyTorch實現(xiàn)Deep Dream240
12.2 風格遷移243
12.2.1 內容損失244
12.2.2 風格損失245
12.2.3 用PyTorch實現(xiàn)神經(jīng)網(wǎng)絡風格遷移247
12.3 PyTorch實現(xiàn)圖像修復252
12.3.1 網(wǎng)絡結構252
12.3.2 損失函數(shù)252
12.3.3 圖像修復實例253
12.4 PyTorch實現(xiàn)DiscoGAN255
12.4.1 DiscoGAN架構256
12.4.2 損失函數(shù)258
12.4.3 DiscoGAN實現(xiàn)258
12.4.4 用PyTorch實現(xiàn)從邊框生成鞋子260
12.5 小結262
第13章 Caffe2模型遷移實例263
13.1 Caffe2簡介263
13.2 Caffe如何升級到Caffe2264
13.3 PyTorch如何遷移到Caffe2265
13.4 小結268
第14章 AI新方向:對抗攻擊269
14.1 對抗攻擊簡介269
14.1.1 白盒攻擊與黑盒攻擊270
14.1.2 無目標攻擊與有目標攻擊270
14.2 常見對抗樣本生成方式271
14.2.1 快速梯度符號法271
14.2.2 快速梯度算法271
14.3 PyTorch實現(xiàn)對抗攻擊272
14.3.1 實現(xiàn)無目標攻擊272
14.3.2 實現(xiàn)有目標攻擊274
14.4 對抗攻擊和防御措施276
14.4.1 對抗攻擊276
14.4.2 常見防御方法分類276
14.5 總結277
第15章 強化學習278
15.1 強化學習簡介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實現(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實現(xiàn)SARSA算法286
15.5 小結287
第16章 深度強化學習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)驗回放機制290
16.1.6 目標網(wǎng)絡290
16.1.7 網(wǎng)絡模型291
16.1.8 DQN算法291
16.2 用PyTorch實現(xiàn)DQN算法292
16.3 小結295
附錄A PyTorch0.4版本變更296
附錄B AI在各行業(yè)的最新應用301