教程| 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現...

2020-12-05 機器之心Pro

作者:李飛飛等機器之心編譯參與: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_2017_Lecture8,連結可直接下載PPT:

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.pdfhttp://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/DL_in_Action.pdf

相關焦點

  • 斯坦福CS224n《基於深度學習的NLP》課程更新,C.Manning主講
    新智元報導 來源:Stanford編輯:大明【新智元導讀】史丹福大學官方公布cs224n課程《基於深度學習的自然語言處理》詳細安排,主講人為史丹福大學人工智慧實驗室主任,著名計算機科學家Christopher Manning教授,1月份課程閱讀材料已公布。本課程自2017 年起開設,2017年該課程視頻已公開放出。
  • CS231n 2017 今天正式開課!雙語字幕版獨家上線!
    雷鋒網:CS231n 2017雙語字幕版獨家上線!今天正式開課!哈哈哈,距離斯坦福計算機視覺課程結束5個月,2017春季CS231n中文版終於上線了,課程中文版已經在AI慕課學院(mooc.ai )發布( free free free ),11月10日正式開課,預計持續12周!
  • 直播分享|手把手教你寫 2019 最新版 CS231n 作業
    然而,傳統院校設置的課程可能已經無法滿足 AI 學習者日益增長的求知需求,很多人會把目光投向海外一些經典院校的開源課程。AI 研習社譯製的雙語課程廣受好評相信每一個學習人工智慧的同學,都聽說過史丹福大學計算機視覺實驗室推出的 CS231n 這門課。
  • CS231n 2017中文字幕視頻:如何訓練機器進行視覺識別?
    :CS231n 2017雙語字幕版獨家上線!CS231n 的全稱是 CS231n: Convolutional Neural Networks for Visual Recognition,即面向視覺識別的卷積神經網絡。該課程是史丹福大學計算機視覺實驗室推出的課程。需要注意的是,我們這次翻譯的是 2017 春季(4 月至 6 月)的最新版本。
  • 「終極收藏」AI領域你不能不關注的大牛、機構、課程、會議、圖書...
    Demis Hassabis:DeepMind創始人兼CEOChristopher Manning:史丹福大學計算機科學和語言學教授Fei-Fei Li(李飛飛):史丹福大學教授、谷歌雲AI/ML首席科學家Franois Chollet:谷歌人工智慧研究員、深度學習框架Keras 的作者Dan Jurafsky:史丹福大學計算機科學系和語言學系教授
  • NLP 領域的 C 位課程!斯坦福 CS224d 中英字幕版重磅上線
    本次翻譯的 CS224d (2016-2017)課程視頻為斯坦官方開源最新版本,由史丹福大學教授、 Salesforce 的首席科學家 Richard Socher 授權雷鋒字幕組翻譯,5 月 16 日開始正式同步更新在 AI 研習社、AI 慕課學院。
  • ...請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    .stanford.edu/notes/cs229-notes3.pdf線性分類:支持向量機,Softmax (Stanford 231n)http://cs231n.github.io/linear-classify/
  • 乾貨 | 請收下這份2018學習清單:150個最好的機器學習,NLP和Python教程
    / 優化算法:隨機梯度下降算法 (Stanford CS231n)http://cs231n.github.io/optimization-1/ 7、生成學習 生成學習算法 (Stanford CS229
  • 重磅發布 | 牛津大學Deep NLP深度自然語言處理課程17年最新(漢化視頻)
    大數據文摘作品,轉載要求見文末大數據文摘重磅推出牛津大學深度學習與自然語言處理課程(Deep NLP)漢化視頻!去年,大數據文摘獲得授權並完成了李飛飛教授史丹福大學CS231N課程視頻的漢化斯坦福《CS231n深度學習與計算機視覺課》(戳標題查看),該課程目前在網易雲課堂有超過4萬人學習,並且好評不斷。
  • 深度學習自學指南:6個月,從基礎知識到模型構建
    原作:Bargava安妮 編譯自 Medium量子位 出品 | 公眾號 QbitAI給你6個月的時間開始學習深度學習,能夠達到怎樣的程度?在這篇文章中,數據科學培訓老師Bargava就帶你半年入門深度學習。在這份攻略中,我將給大家講講零基礎入門深度學習可行性強的資料和學習方法。
  • CS231n 課後作業第二講 : Assignment 2(含代碼實現)| 分享總結
    是史丹福大學開設的計算機視覺與深度學習的入門課程,授課內容在國內外頗受好評。本文根據AI研習社公開課上的直播視頻內容整理而成,主要介紹CS231n 課後作業第二套Assignment 2的完成思路與重點部分代碼實現。如果你還沒開始聽CS231n,可直接點擊課程連結觀看回放視頻。王煦中,CS碩士,主要研究方向為自然語言處理與深度學習。知乎專欄喵神大人的深度工坊(http://t.cn/RTc9wfy)作者,日語及ACGN愛好者。
  • 斯坦福學長指路!給AI萌新的本科4年課程清單(課程直達)
    大數據文摘出品編譯:笪潔瓊相信每個入行人工智慧的老手,對自己過往的幾年學習生涯都或多或少會有一些遺憾:如果我當年先從基本概念入手就好了,如果我當年把核心算法吃的更透一點就好了……最近,一位在行業內工作了幾年的斯坦福人工智慧」師兄「就根據自己的工作和學習經驗,為入學的師弟師妹們送出了一份大禮:人工智慧的本科4年課程清單,希望想要了解人工智慧的新生能夠靠著這份指路圖
  • 乾貨| 請收下這份2018學習清單:150個最好的機器學習,NLP和Python...
    /優化算法:隨機梯度下降算法 (Stanford CS231n)http://cs231n.github.io/optimization-1/7、生成學習生成學習算法 (Stanford CS229)http://cs229.stanford.edu/notes/cs229-notes2.
  • 吳恩達授課,斯坦福CS230深度學習課程資源開放
    機器之心整理參與:劉曉坤、雪、思源近日由吳恩達與 Kian Katanforoosh 指導的 CS230(深度學習)課程已經結束並放出了課程資料。這一門課程結合 Coursera 課外教學與課內教學展示了深度學習的基本概念與完整結構,機器之心簡要介紹了該課程及基本內容。
  • Keras vs PyTorch:誰是第一深度學習框架?
    Keras 是谷歌支持的一款框架。  PyTorch 於 2017 年 1 月對外發布,是專注於直接處理數組表達式的較低級別 API。去年它受到了大量關注,成為學術研究和需要優化自定義表達式的深度學習應用偏好的解決方案。它是 Facebook 支持的一款框架。  在討論二者的具體細節之前,我們想先說明:對於「哪一個框架更好」這個問題我們沒有直接明了的答案。
  • 我們測評了15門最火課程,幫你找到最適合的
    無論你是剛開始接觸NLP還是想在業務中實現一個最新算法,這篇文章都將為你提供巨大價值。下面就來看一下這條學習路徑,並挑你最感興趣的課程吧!缺點:這門課不是很全面,也缺乏關於最新算法和實際業務案例內容。而且,它只使用tensorflow,沒有涉及到keras,對於學習深度學習來說,這並不是一個很好的方式。
  • 為什麼要進行圖學習?談一談逆勢而上的圖神經網絡
    -時空數據挖掘深度學習技術全面綜述NeurIPS2020 | Google《圖學習與挖掘》綜述教程,311頁ppt+教程NeurIPS2020 | 圖對比學習 | 結合四種數據擴充方式進行對比學習(附論文代碼連結)NeurIPS2020 | 四篇圖魯棒性研究相關論文一覽方法總結 | 兩篇論文分析解耦/分離/Disentangled/圖神經網絡表示學習
  • 瀏覽器中實現深度學習?有人分析了7個基於JS語言的DL框架
    具體而言,作者重點分析了 7 個最近出現的基於JavaScript 的 DL 框架,並對比了具體框架支持哪些 DL 任務。深度學習(Deep Learning,DL)是一類利用多層非線性處理單元(稱為神經元)進行特徵提取和轉換的機器學習算法。每個連續層使用前一層的輸出作為輸入。近十年來,深度學習技術的進步極大地促進了人工智慧的發展。
  • 200個精選ML、NLP、Python及數學最佳教程(附連結)
    [ 導讀 ]近年來,機器學習等新最新技術層出不窮,如何跟蹤最新的熱點以及最新資源,作者Robbie Allen列出了一系列相關資源教程列表,包含四個主題:機器學習,自然語言處理,Python和數學,建議大家收藏學習!
  • 瀏覽器中實現深度學習?有人分析了7個基於JS語言的DL框架,發現還有...
    具體而言,作者重點分析了 7 個最近出現的基於JavaScript 的 DL 框架,並對比了具體框架支持哪些 DL 任務。深度學習(Deep Learning,DL)是一類利用多層非線性處理單元(稱為神經元)進行特徵提取和轉換的機器學習算法。每個連續層使用前一層的輸出作為輸入。近十年來,深度學習技術的進步極大地促進了人工智慧的發展。