斯坦福CS231n最新課程:詳解深度學習的框架對比與實現
選自Stanford
作者:李飛飛等
機器之心編譯
參與:Smith
斯坦福大學的課程 CS231n (Convolutional Neural Networks for Visual Recognition) 作為深度學習和計算機視覺方面的重要基礎課程,在學界廣受推崇。今年 4 月,CS231n 再度開課,全新的 CS231n Spring 2017 仍舊由李飛飛帶頭,帶來了很多新鮮的內容。今天機器之心給大家分享的是其中的第八講——深度學習軟體(Deep Learning Software)。主要內容有:CPU 和 GPU 的對比;深度學習框架簡介;TensorFlow 和 PyTorch 的實例;以及各種深度學習框架的比較。
一、 CPU 和 GPU
CPU:核芯的數量更少;
但是每一個核芯的速度更快,性能更強;
更適用於處理連續性(sequential)任務。
GPU:核芯的數量更多;
但是每一個核芯的處理速度較慢;
更適用於並行(parallel)任務。
二、深度學習框架簡介
去年我們還僅有 Caffe、Torch、Theano 和 TensorFlow 這些深度學習框架可供使用;但是到了今年,在此基礎上我們又新增加了 Caffe2、Pytorch、TensorFlow、PaddlePaddle、 CNDK、MXNet 等等一系列新的框架,可謂「百花齊放」。如今最常用的框架當數 Pytorch 和 TensorFlow 了, 而 Caffe 和 Caffe2 次之。
深度學習框架的關鍵點在於:
(1)易於建造大型的計算機圖形;
(2)易於在計算機圖形中進行梯度計算;
(3)能在 GPU 上高效運行(cuDNN, cuBLA 等)
三、TensorFlow 簡單實例
下面我們將詳細說明一個在 TensorFlow 下訓練神經網路的簡單實例:即用隨機數據訓練一個兩層的網路,激活函數為 ReLU。
a. 定義計算機圖形:
1. 為輸入 x,權重係數 w1、w2, 和目標函數 y 創建 placeholder:
2. 定義前向傳輸:這是為了計算 y 的預測值和誤差損失(loss);實際上這裡是沒有計算過程的——僅僅是為了創建圖形!
3. 告訴 Tensorflow 去計算關於 w1 和 w2 的梯度損失;這裡仍然不產生計算過程——僅僅是為了創建圖形。
b. 運行
現在已經完成了創建圖形的步驟,所以我們進入對圖形進行運算的部分。
創建 Numpy 數組,這個數組將會被填進上方的 placeholder 中。
對圖形進行運算:將 x、y、w1、w2 輸入到 numpy 數組中;得到關於損失(loss),w1 梯度和 w2 梯度的 numpy 數組。
訓練網路:反覆對圖形進行運算,用梯度(gradient)來更新權重(weights)。
把 w1 和 w2 的相應函數從 placeholder() 改為 Variable()。
添加 assign 操作來更新 w1 和 w2(圖形的一部分)。
對圖形進行一次運算來初始化 w1 和 w2,然後進行多次迭代訓練。
完整代碼如下:
但是產生一個問題:誤差損失(loss)並沒有下降!這是因為 Assign 指令實際上並沒有被執行。
這時我們就需要添加虛擬圖形節點,並且告訴圖形去計算虛擬節點。
可以使用 optimizer 來計算梯度和更新權重係數;記得要執行 optimizer 的輸出!
使用預先定義的常用損失函數:
使用 Xavier 進行初始化;tf.layer 會自動設置權重係數(weight)和偏置項(bias)!
c. 高級 Wrapper——Keras
Keras 可以理解為是一個在 TensorFlow 頂部的 layer,它可以讓一些工作變得更加簡單(也支持 Theano 後端)。
把模型目標定義成一系列的 layer :
定義優化器目標(optimizer object):
創建模型,明確規定損失函數(loss function):
僅用一行代碼就能訓練模型!
除了 Keras, 還有一些其他類型的高級容器(Wrapper)可供使用:
四、PyTorch 實例
PyTorch 是 Facebook 推出的深度學習框架,不論是在工業界還是學術界,它都得到了廣泛的應用。它包括三個等級的抽象概念:
張量(Tensor):命令式的多維數組對象(ndarray),在 GPU 上運行;
變數(Varaible):計算型圖形(computational graph)的節點;用於存儲數據和梯度(gradient)
模塊(Module):代表一個神經網路層;可以存儲狀態(state), 也可以存儲可學習的權重係數(learnable weights)
PyTorch 和 TensorFlow 中抽象概念的等價對應關係:
a. Pytorch 中的張量(Tensor)設置
PyTorch 中的張量就像 numpy 中的數組,但是這些張量可以在 GPU 上運行;
這裡我們用 PyTorch 的張量設置了一個兩層網路:
下面我們來分步解讀:
1. 為數據和權重(weights)創建隨機張量:
2. 設置前向傳播:計算預測值(prediction)和損失(loss):
3. 設置反向傳播:計算梯度(gradients):
4. 梯度下降(Gradient descent)和權重(weights)相對應:
5. 為了在 GPU 上運行,將張量(tensors)設置為 cuda 數據類型:
b. PyTorch 中的 Autogradient 設置
PyTorch 的張量(Tensors)和變數(Variables)擁有相同的應用編程介面 API。變數(Variables)可以記憶它們是怎麼產生的(因為反向傳播的緣故)。
下面仍進行分步解讀:
1. 我們不希望(損失 loss 的)梯度和數據(data)有相關性,但我們希望梯度和權重(weights)是相關的。相關設置如圖:
2. 這裡的前向傳播看上去和上述張量(Tensor)的對應版本很相似,但是需要注意的是現在這裡全部都是變數(variable)。
3. 計算損失函數對 w1 和 w2 的梯度(開始的時候梯度置零):
4. 讓梯度和權重(weights)相對應:
C. 定義新型 Autograd 函數
通過張量的前向和反向傳播來定義你自己的 autograd 函數:
可以在前向傳播中使用新的 autograd 函數:
d. PyTorch 中的神經網路(nn)設置
用更高級的「容器」(wrapper)來處理神經網路(neural nets), 和 Keras 相似。完整代碼如下:
下面進行分步解讀:
把我們的模型定義成一系列的 layers:
也要定義常用損失函數:
前向傳播:給模型輸入數據;給損失函數(loss function)輸入預測信息(prediction):
反向傳播:計算所有的梯度(gradients):
讓梯度和每一個模型參數對應:
下面我們添加一個優化器(optimizer):
在計算完梯度以後對所有的參數(parameters)進行更新:
E. PyTorch 中的神經網路——定義新的模型
Pytorch 中的模塊(Module)其實是一個神經網路層(neural net layer),需要注意它的輸入和輸出都是變數;模塊(Module)中包含著權重 (當作變數處理) 或者其他模塊;你可以使用 autograd 來定義你自己的模塊。詳細代碼如下:
下面進行分步解讀:
1. 把我們的整體模型定義成一個單一的模塊:
2. 用初始化程序來設置兩個子模塊(一個父模塊可以包含子模塊)
3. 用子模塊和變數上的 autograd ops 定義前向傳播;不需要定義反向傳播——因為 autograd 會作相應處理:
4. 創建並訓練一個模型實例:
E. PyTorch 中的資料存儲器(Dataloaders)
資料存儲器(DataLoader)包括一個數據集 (Dataset),而且給你提供了小批量處理(minibatching),「洗牌」處理(shuffling)和多線程處理(multithreading);當你需要載入自定義數據(custom data)時,寫下你自己的數據集類型(dataset class)就可以了。
通過遍歷存儲器(loader)來形成小批量(minibatch);存儲器會給你提供張量(Tensors), 所以你需要將其「打包」(wrap)進變數中:
注意:使用帶有 torchvision 的預先訓練好的模型(pretrained model)將會更加簡單易行。
F. Torch 和 pytorch 的簡單對比
結論:盡量使用 PyTorch 來做你的新項目。
五、Caffe2 簡介
六、深度學習框架之爭,究竟誰更勝一籌?
其實具體選擇何種框架來進行深度學習取決於我們要做什麼。在參閱相關文獻之後,我們大致可以得出以下結論(僅供參考):
PyTorch 和 Torch 更適用於學術研究(research);TensorFlow,Caffe,Caffe2 則更適用於工業界的生產環境部署(industrial production)。
Caffe 適用於處理靜態圖像(static graph);Torch 和 PyTorch 更適用於動態圖像(dynamic graph);而 TensorFlow 在兩種情況下都很實用;
Tensorflow 和 Caffe2 可在移動端使用
附參考文獻(斯坦福課程 CS231n; 以及港中文課程 ELEG5491):
http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture8.pdf
http://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/tutorial-caffe.pdf
http://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/DL_in_Action.pdf


※深度學習助力前端開發:自動生成GUI圖代碼(附試用地址)
※TensorFlow分布式計算機制解讀:以數據並行為重
※MIT提出生成式壓縮:使用生成式模型高效壓縮圖像與視頻數據
※深度學習助力前端開發:自動生成GUI圖代碼,附試用地址
TAG:機器之心 |
※2款AI晶元、深度學習框架MindSpore:華為史無前例集中發布AI戰略
※華為史無前例集中發布AI戰略 : 2款AI晶元、深度學習框架MindSpore
※最適合中國開發者的深度學習框架:走向成熟的PaddlePaddle 1.0
※58集團RPC框架SCF的設計與實踐
※深度學習第8期:深度學習的常見框架
※華為史上最強晶元昇騰910面世,算力超Tesla V100一倍,AI框架MindSpore明年開源
※【每月好書】深度學習框架PyTorch入門與實踐
※DeepMind用基於AI的元強化學習框架研究多巴胺在學習過程中的作用
※蘋果將在iOS 11.4中加入全新的ClassKit框架
※雲從科技 OCR 新突破:端到端的深度學習文本檢測框架 Pixel-Anchor
※Caffe2代碼全部併入PyTorch:深度學習框架格局劇震
※深度學習框架格局劇震:Caffe2 代碼全部併入 PyTorch
※NeurIPS 2018網易推出強化編程框架
※傳ARKit、macOS將支持AR頭顯,WWDC 2019宣布,及Swift全新AR框架
※蘋果iOS 11.4更新曝光:支持全新ClassKit框架
※阿里巴巴開源深度學習框架 X-Deep Learning,引領高維稀疏數據場景的深度學習標準
※微軟開源 repo 1.0 ,旨在創造深度學習框架通用語言
※微軟開源 repo 1.0,旨在創造深度學習框架通用語言
※2018·JS「年鑒」:ES6鋒芒依舊,React和Express成為前、後端最受歡迎框架
※谷歌Chrome 67將加入全新WebXR框架