1. 程式人生 > >斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現與對比

斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現與對比

斯坦福大學的課程 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.pdf
  • http://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/DL_in_Action.pdf

相關推薦

斯坦福CS231n 2017最新課程飛飛深度學習框架實現對比

斯坦福大學的課程 CS231n (Convolutional Neural Networks for Visual Recognition) 作為深度學習和計算機視覺方面的重要基礎課程,在學界廣受推崇。今年 4 月,CS231n 再度開課,全新的 CS231n Spring 2017 仍舊由李飛飛帶頭,帶來

斯坦福CS231n-2017春季課程全公開,視訊+PPT+英文字幕

轉需-這是斯坦福最新的2017春季課程,想入手計算機視覺的同學不要錯過,隨著feifei li成為中國google人工智慧研發中心領頭人,想象在計算機視覺方面會有很大的促進和提升作用,希望大家共同進步,O(∩_∩)O~~ 全部課程視訊(英文字幕):http://t.cn

2017深度學習最新報告及8大主流深度學習框架超詳細對比(內含PPT)

​ 深度學習領軍人物 Yoshua Bengio 主導的蒙特利爾大學深度學習暑期學校目前“深度學習”部分的報告已經全部結束。 本年度作報告的學術和行業領袖包括有來自DeepMind、谷歌大腦、蒙特利爾大學、牛津大學、麥吉爾大學、多倫多大學等等。覆蓋的主題包括:時間遞迴神經網路、自然語言處理、生成模型、大腦

王權富貴書評《TensorFlow實戰Google深度學習框架第二版》(鄭澤宇 樑博文 顧思宇 著)

一本介紹TensorFlow的書,比較基礎,但是還是寫的不好。這本是我TensorFlow的啟蒙書,我硬著頭皮看完的,目前還沒發現比這本書好的。 推薦指數:**                   

深度學習之經典網路架構(十)九大框架彙總

目錄 0、概覽 2、總結 本文是對本人前面講的的一些經典框架的彙總。 純手打,如果有不足之處,可以在評論區裡留言。 0、概覽 1、個人心得 (1)LeNet:元老級框架,結構簡單,卻開創了卷積神經網路的新紀元,具有重要的學

Deepo幾乎包含所有主流深度學習框架的Docker映象

背景 最近實驗室要參加一個目標檢測的比賽,這段時間一直在跑ssd模型,最開始根據作者給的文件成功編譯後,可以在VOC資料集上進行訓練。由於要用比賽官方的資料集,因此做了幾天的資料集,然後拿自己的資料集訓練的時候,出現了以下報錯:Check failed: a <= b (0 vs. -1.

資料結構之AVL樹及C++模板實現

AVL樹簡介AVL樹的名字來源於它的發明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL樹是最先發明的自平衡二叉查詢樹(Self-Balancing Binary Search Tree,簡稱平衡二叉樹)。一棵AVL樹有如下必要條件:條件一:它必

深度學習之經典網路架構(九)DPN(Dual Path Network)

目錄 0、簡介 1、優勢 3、總結 0、簡介 論文:Dual Path Networks 演算法詳解: 介紹的duall path networks(DPN)是顏水成老師新作,2017年4月在arxiv上放出,對於影象分類的效果有一定提升。我們知

Nebula Graph 技術總監陳恆圖資料庫怎麼和深度學習框架進行結合?

引子 Nebula Graph 的技術總監在 09.24 - 09.30 期間同開源中國·高手問答的小夥伴們以「圖資料庫的設計和實踐」為切入點展開討論,包括:「圖資料庫的儲存設計」、「圖資料庫的計算設計」、「圖資料庫的架構設計」等方面內容,本文整理於他和開源中國小夥伴對圖資料庫的討論內容~ 嘉賓·陳恆介紹 陳

Stanford CS231n 2017春季課程

斯坦福大學的 CS231n(全稱:面向視覺識別的卷積神經網路)一直是計算機視覺和深度學習領域的經典課程,每年開課都吸引很多學生。今年是該課程第3次開課,學生達到730人(第1次150人,第2次350人)。今年的CS231n Spring的instructors 是李飛飛、Ju

斯坦福cs231n計算機視覺訓練營----(10.8/10.9任務學習筆記)

深度學習緒論視訊筆記: 1.機器學習是在特定的場景中,期望演算法能夠像人一樣,自動給出我們想要的輸出,不需要我們編寫一些特定的規則。 2.傳統機器學習和深度學習的最大的區別是前者用人工提取的特徵來表述資料,然後運用對領域的特定知識進行手動提取;而後者用機器提取的特徵來表述資料,並且自動提取內

ml課程XGBoost和lightGBM工具庫學習及相關案例程式碼

以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 本文主要介紹kaggle大殺器xgboost和lightgbm兩個工具庫的簡單使用,以及相關案例程式碼。 首先回憶一下boosting原理,以及由boosting衍生出來的演算法:Adaboost和GBDT以及後面更強的xgboos

斯坦福「目標檢測」深度學習全面指南

來源:雷克世界 概要:Faster R-CNN,R-FCN和SSD是目前市面上最好和最廣泛使用的三個目標檢測模型。而其他受歡迎的模型往往與這三個模型非常相似,所有這些都依賴於深度CNN的知識來完成

斯坦福大學-菲菲,深度學習1到9講聽課筆記

CS231n 計算機視覺歷史回顧與介紹 第一課時:   深度神經網路:卷積神經網路   計算機視覺是跨學科的領域   NLP 自然語言處理   生物進化出眼睛   相機的出現   基礎視覺皮層(處理視覺) 第二課時:   通過實驗發現,視覺處理的第一步是對簡單的形狀結構處理

【備忘】最新深度學習框架-Tensorflow案例實戰視訊課程下載

課程章節第1章Tensorflow基礎操作1小時17分鐘8節1-1Tensorflow案例實戰視訊課程01 課程簡介 00:381-2Tensorflow案例實戰視訊課程02 Tenso 07:091-3Tensorflow案例實戰視訊課程03 基本計算單元-變數 08:3

斯坦福DAWNBench華為雲ModelArts深度學習訓練全球最快

res 服務 資源 搜索 由於 機器 最短時間 包含 讀取 斯坦福DAWNBench:華為雲ModelArts深度學習訓練全球最快 近日,斯坦福大學發布了DAWNBenchmark最新成績,在圖像識別(ResNet50-on-ImageNet,93%以上精度)的總訓練時間上

Linuxat命令

計時 osi 執行 inux days pan 必須 man 一個 at命令 at命令為單一工作調度命令。at命令非常簡單,但是在指定時間上卻非常強大 語法 at [選項] time at > 執行的命令 ctrl+d 選項 -m :當指定的任務被

WebApi 接口參數不再困惑傳參

gin ebr 字符流 sts ash nbsp 之前 ret 傳遞對象 轉自:http://www.cnblogs.com/landeanfen/p/5337072.html 閱讀目錄 一、get請求 1、基礎類型參數 2、實體作為參數 3、數組作為

OSPF之三OSPF LSA

ospf lsa詳解 forwarding address OSPF LSA詳解OSPF V2版本中常用的主要有6類LSA,分別是Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA、AS-External-LSA、NSSA-LSA,接