2019 深度學習工具匯總
深度學習工具
深度學習的進步也嚴重依賴于軟件基礎架構的進展。 軟件庫如: Torch(2011), Theano(2012), DistBelief(2012), PyLearn2 (2013), Caffe(2013), MXNet (2015) 和 TensorFlow(2015) 都能支持重要的研究項目或商業產品。
如果說深度學習的話,我個人接觸是在2015年,這個技術其實被雪藏了很久,在2012年又得到了完全的爆發,至今已經是AI界的主流,那今天就來說說最實際也是接觸最多的一個環節,那就是框架,也可以說是工具。
大家所了解的工具不知道有哪些???
今天,我以我使用過的工具來和大家分享,希望你們可以找到自己喜歡的工具,與其一起去“ 煉丹 ”(不知道這個意思的,百度下)嘿嘿!
在我研究生入學以來,接觸的深度學習工具一只手就可以數過來,有興趣的小伙伴可以深入搜索,網上還是有很多不同說法。我接下來根基我自己的實際體驗而大家說說深度學習工具這些事。 Matlab
Matlab
剛開始接觸深度學習,第一個使用的工具就是:DeepLearnToolbox,一個用于深度學習的Matlab工具箱。 深度學習作為機器學習的一個新領域,它的重點是學習深層次的數據模型,其主要靈感來自于人腦表面的深度分層體系結構,深度學習理論的一個很好的概述是學習人工智能的深層架構。這個工具箱比較簡單,當時我就做了一個手寫數字和人臉分類(AR人臉數據庫)。主要包括如下:
NN :前饋BP神經網絡的庫
CNN :卷積神經網絡的庫
DBN :深度置信網絡的庫
SAE :堆棧自動編碼器的庫
CAE :卷積自動編碼器的庫
Util :庫中使用的效用函數
Data :數據存儲
tests :用來驗證工具箱正在工作的測試
案例如下
- rand('state',0)
- cnn.layers = {
- struct('type', 'i') %輸入
- struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %卷積層
- struct('type', 's', 'scale', 2) %下采樣層
- struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %卷積層
- struct('type', 's', 'scale', 2) %下采樣層
- };
- cnn = cnnsetup(cnn, train_x, train_y); opts.alpha = 1;
- opts.batchsize = 50;
- opts.numepochs = 5;
- cnn = cnntrain(cnn, train_x, train_y, opts); save CNN_5 cnn;
- load CNN_5;
- [er, bad] = cnntest(cnn, test_x, test_y); figure; plot(cnn.rL);
- assert(er<0.12, 'Too big error');
運行界面比較單一:
PyTorch
這個Pytorch庫的話,其實我沒怎么用,就是隨便試玩了下,個人感覺還是不要碰了,沒啥意思,我接下來也就簡單聊一下。 他是一個基于Python的科學計算包,目標用戶有兩類。一類是 為了使用GPU來替代numpy;另一類是一個深度學習援救平臺:提供最大的靈活性和速度。
以深度學習來說,可以使用 torch.nn 包來構建神經網絡。已知道autograd包,nn包依賴autograd包來定義模型并求導。一個nn.Module包含各個層和一個faward(input)方法,該方法返回output。
案例如下
- import torch from torch.autograd
- import Variable import torch.nn
- import torch.nn.functional as F
- class Net(nn.Module):
- def __init__(self):
- super(Net, self).__init__()
- # 1 input image channel, 6 output channels, 5*5 square convolution
- # kernel
- self.conv1 = nn.Conv2d(1, 6, 5)
- self.conv2 = nn.Conv2d(6, 16, 5)
- # an affine operation: y = Wx + b
- self.fc1 = nn.Linear(16 * 5 * 5, 120)
- self.fc2 = nn.Linear(120, 84)
- self.fc3 = nn.Linear(84, 10)
- def forward(self, x):
- # max pooling over a (2, 2) window
- x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
- # If size is a square you can only specify a single number
- x = F.max_pool2d(F.relu(self.conv2(x)), 2)
- x = x.view(-1, self.num_flat_features(x))
- x = F.relu(self.fc1(x))
- x = F.relu(self.fc2(x))
- x = self.fc3(x)
- return x
- def num_flat_features(self, x):
- size = x.size()[1:]
- # all dimensions except the batch dimension
- num_features = 1
- for s in size:
- num_features *= s
- return num_features
- net = Net()
- print(net)
具體操作和細節過程,有興趣的可以抽空去玩玩!
Caffe
Caffe的作者為UC Berkeley大學的賈揚清。Caffe是一個c++/CUDA架構,支持命令行、Python、Matlab接口,可以在CPU/GPU上運行。
深度學習不斷在發展,其對應的實驗工具也隨著得到了大家的重視。Caffe就是現在流行的深度學習框架之一,工具內已經提前提供了模板,也就是該工具有現成的編程框架,而且可以與現狀流行的圖形計算GPU聯合使用,加快網絡訓練的速度,流行的神經網絡框架算法都可以在Caffe中運行,而且可以自己設置框架,因為Caffe已經提前就做好了各結構的定義,研究學者也可以根據自己的設計需求去進行相應的添加,設計出新的深度學習框架去完成所需的任務。
Caffe框架中,主要就是 Blobs , Layers 和 Nets 三大類結構,而且由于是事前定義好的結構,所以在使用該框架的時候是不可以更改。
Blobs
Blob是Caffe框架中的一個主要結構,其為包裝器,在使用Caffe框架時,數據都要被設置成格式,只有這樣的數據格式才能在Caffe框架中進行執行和處理。并且在Caffe設計時,很多函數和類都提前設計好了,在執行的過程中是不可以修改其結構,否則將無法調用其中的函數,導致網絡訓練的失敗。
Blob的格式主要由Number,Channel,Height和Width四個元素組成,如果在進行圖像處理,則表示圖像通道(一般彩色圖像為3通道的數據,Height和Width就表示輸入數據的尺寸。而對于的元素,其主要體現在訓練過程中,因為訓練的時候需要選擇一次性輸入多少數據,就是一次輸入數據的數量,通常稱之為Batch。這種訓練方式也可以大大緩解內存的不足。
Layers
Layers是Caffe框架中網絡構成的重要結構之一,網絡的構成就是因為Layers的作用,通過接收輸入和輸出數據,最后通過內部的計算輸出。Caffe在使用網絡層的時候,其定義方式特別簡單明了,大致都分為三個小步驟,如下:
1)建立網絡層,且建立層之間的連接關系,可以通過隨機初始化的操作,去對一些網絡層的變量進行初始化;
2)網絡訓練過程中,首先計算前向傳播,在改過過程中Layers接受上一層的輸出數據作為本次的輸入數據,最后通過內部
的計算進行輸出。
3)前向傳播后,由于得到的結果與期望相差較大,通過之前提及到的反向傳播來進行計算去調整網絡的參數值,以達到最
優值,并且在反向傳播計算時,Layers會把每次計算的梯度值存放在該層中。
Nets
之前介紹的Layers就是Nets的一個子元素,通過多種Layers的組合連接得到整個Nets,在該結構中,Nets定義了網絡的各 Layers、Input和Output。
例如Caffe定義中最基本的隱層網絡,其定義如下:
- name: “LogReg”
- layers {
- name: “mnist”
- type: DATA
- top: “data”
- top: “label”
- data_param {
- source: “input_leveldb”
- batch_size: 64
- }}
- layers {
- name: “ip”
- type: INNER_PRODUCT
- bottom: “data”
- top: “ip”
- inner_product_param {
- num_output: 2
- }}
- layers {
- name: “loss”
- type: SOFTMAX_LOSS
- bottom: “ip”
- bottom: “label”
- top: “loss”
- }
Caffe優勢
-
Caffe作為一個開源的框架,其表達式的結構得到很多研究學者的喜愛,因為其可以鼓勵更過的人去進行創新、修改完善及實際應用。在框架中,網絡的模型、設計和優化過程都是指令來調用和執行,不像其他工具框架,需要通過硬編碼來獲取相應的操作。而且在Caffe應用中可以使用CPU中央處理器和GPU圖形圖像處理器進行學習,而且兩個處理器可以來回切換,只要通過在GPU機器上設置一個指令就可以,而且GPU的使用在普遍增加,因為其可以給予網絡的訓練速度,減少訓練的時間,提高網絡的訓練效率,進一步對網絡進行微調。
-
開源框架的好處就是可以被大家擴展,所以Caffe促進了其自身的開發,在賈揚清創建Caffe之后,僅在一年時間里,就已經有上千位研究愛好者參加了開發,而且他們都做出了很大的貢獻才會有現在完善的深度學習框架,現在該框架還在不斷進行優化和發展。
-
上手快,因為網絡模型不需要用代碼的形式表現出來,只需要通過文本形式表現,并且Caffe框架中已定義了該模型。
-
Caffe的出現特征事宜學校機構的實驗室和工業相關部門的使用。因為Caffe與英偉達GPU合用,可以達到很高的效率。曾有過一個實驗,用一臺英偉達生產的K40圖形圖像處理器去訓練圖片,一天下來可以執行六千萬以上的訓練圖像。現在其表現的速度,在常用的深度學習框架中,可以算得上最快的框架之一。
-
方便快速地使用到其他任務重,因為Caffe已經定義了各層的類型,只需通過簡單調用來定義自己設計的網絡模型即可。
TF
Google在2011年推出人工深度學習系統——DistBelief。通過DistBelief,Google能夠掃描數據中心數以千計的核心,并建立更大的神經網絡。這個系統將Google應用中的語音識別率提高了25%,以及在Google Photos中建立了圖片搜索,并驅動了Google的圖片字幕匹配實驗。DistBelief還存在不少不足和限制。它很難被設置,和Google內部的基礎設施聯系也過于緊密,這導致研究代碼機會不可能分享。
針對以上問題,Google在2015年Google Research Blog宣布推出新一代人工智能學習系統——TensorFlow。
TensorFlow是一個異構分布式系統上的大規模機器學習框架,移植性好(小到移動設備如手機,大到大規模集群,都能支持),支持多種深度學習模型。根據Google說法,TensorFlow是綜合的、靈活的、可移植的、易用的,更為關鍵的,它是開源的。同時,TensorFlow的速度相比前代DistBelief有了不小的提升,在一些跑分測試中,TensorFlow的得分是第一代系統的兩倍。
盡管如此,TensorFlow的效率仍然比不過其他大部分開源框架。不過,隨著TensorFlow源碼逐步開放,對新硬件、新設備、新的加速如cuDNN的支持力度不斷提升,其成為目前極具潛力的深度學習。
有興趣可以體驗下PlayGround,其是一個用于教學目的的簡單神經網絡的在線演示、實驗的圖形化平臺,非常強大地可視化了神經網絡的訓練過程。使用它可以在瀏覽器里訓練神經網絡,對 Tensorflow有一個感性的認識。
TF缺點
-
TensorFlow 的每個計算流都必須構造為一個靜態圖,且缺乏符號性循環(symbolic loops),這會帶來一些計算困難;
-
沒有對視頻識別很有用的三維卷積(3-D convolution);
-
盡管 TensorFlow 現在比起始版本快了 58 倍,但在執行性能方面依然落后于競爭對手。
今天就到此位置吧,感覺講的有點多,但是又不是很深入,有機會來一次深度學習工具專題,我們大家一起慢慢聊!



































