2019 深度學(xué)習(xí)工具匯總
深度學(xué)習(xí)工具
深度學(xué)習(xí)的進(jìn)步也嚴(yán)重依賴于軟件基礎(chǔ)架構(gòu)的進(jìn)展。 軟件庫如: Torch(2011), Theano(2012), DistBelief(2012), PyLearn2 (2013), Caffe(2013), MXNet (2015) 和 TensorFlow(2015) 都能支持重要的研究項目或商業(yè)產(chǎn)品。
如果說深度學(xué)習(xí)的話,我個人接觸是在2015年,這個技術(shù)其實被雪藏了很久,在2012年又得到了完全的爆發(fā),至今已經(jīng)是AI界的主流,那今天就來說說最實際也是接觸最多的一個環(huán)節(jié),那就是框架,也可以說是工具。
大家所了解的工具不知道有哪些???
今天,我以我使用過的工具來和大家分享,希望你們可以找到自己喜歡的工具,與其一起去“ 煉丹 ”(不知道這個意思的,百度下)嘿嘿!
在我研究生入學(xué)以來,接觸的深度學(xué)習(xí)工具一只手就可以數(shù)過來,有興趣的小伙伴可以深入搜索,網(wǎng)上還是有很多不同說法。我接下來根基我自己的實際體驗而大家說說深度學(xué)習(xí)工具這些事。 Matlab
Matlab
剛開始接觸深度學(xué)習(xí),第一個使用的工具就是:DeepLearnToolbox,一個用于深度學(xué)習(xí)的Matlab工具箱。 深度學(xué)習(xí)作為機(jī)器學(xué)習(xí)的一個新領(lǐng)域,它的重點是學(xué)習(xí)深層次的數(shù)據(jù)模型,其主要靈感來自于人腦表面的深度分層體系結(jié)構(gòu),深度學(xué)習(xí)理論的一個很好的概述是學(xué)習(xí)人工智能的深層架構(gòu)。這個工具箱比較簡單,當(dāng)時我就做了一個手寫數(shù)字和人臉分類(AR人臉數(shù)據(jù)庫)。主要包括如下:
NN :前饋BP神經(jīng)網(wǎng)絡(luò)的庫
CNN :卷積神經(jīng)網(wǎng)絡(luò)的庫
DBN :深度置信網(wǎng)絡(luò)的庫
SAE :堆棧自動編碼器的庫
CAE :卷積自動編碼器的庫
Util :庫中使用的效用函數(shù)
Data :數(shù)據(jù)存儲
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的科學(xué)計算包,目標(biāo)用戶有兩類。一類是 為了使用GPU來替代numpy;另一類是一個深度學(xué)習(xí)援救平臺:提供最大的靈活性和速度。
以深度學(xué)習(xí)來說,可以使用 torch.nn 包來構(gòu)建神經(jīng)網(wǎng)絡(luò)。已知道autograd包,nn包依賴autograd包來定義模型并求導(dǎo)。一個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)
具體操作和細(xì)節(jié)過程,有興趣的可以抽空去玩玩!
Caffe
Caffe的作者為UC Berkeley大學(xué)的賈揚清。Caffe是一個c++/CUDA架構(gòu),支持命令行、Python、Matlab接口,可以在CPU/GPU上運行。
深度學(xué)習(xí)不斷在發(fā)展,其對應(yīng)的實驗工具也隨著得到了大家的重視。Caffe就是現(xiàn)在流行的深度學(xué)習(xí)框架之一,工具內(nèi)已經(jīng)提前提供了模板,也就是該工具有現(xiàn)成的編程框架,而且可以與現(xiàn)狀流行的圖形計算GPU聯(lián)合使用,加快網(wǎng)絡(luò)訓(xùn)練的速度,流行的神經(jīng)網(wǎng)絡(luò)框架算法都可以在Caffe中運行,而且可以自己設(shè)置框架,因為Caffe已經(jīng)提前就做好了各結(jié)構(gòu)的定義,研究學(xué)者也可以根據(jù)自己的設(shè)計需求去進(jìn)行相應(yīng)的添加,設(shè)計出新的深度學(xué)習(xí)框架去完成所需的任務(wù)。
Caffe框架中,主要就是 Blobs , Layers 和 Nets 三大類結(jié)構(gòu),而且由于是事前定義好的結(jié)構(gòu),所以在使用該框架的時候是不可以更改。
Blobs
Blob是Caffe框架中的一個主要結(jié)構(gòu),其為包裝器,在使用Caffe框架時,數(shù)據(jù)都要被設(shè)置成格式,只有這樣的數(shù)據(jù)格式才能在Caffe框架中進(jìn)行執(zhí)行和處理。并且在Caffe設(shè)計時,很多函數(shù)和類都提前設(shè)計好了,在執(zhí)行的過程中是不可以修改其結(jié)構(gòu),否則將無法調(diào)用其中的函數(shù),導(dǎo)致網(wǎng)絡(luò)訓(xùn)練的失敗。
Blob的格式主要由Number,Channel,Height和Width四個元素組成,如果在進(jìn)行圖像處理,則表示圖像通道(一般彩色圖像為3通道的數(shù)據(jù),Height和Width就表示輸入數(shù)據(jù)的尺寸。而對于的元素,其主要體現(xiàn)在訓(xùn)練過程中,因為訓(xùn)練的時候需要選擇一次性輸入多少數(shù)據(jù),就是一次輸入數(shù)據(jù)的數(shù)量,通常稱之為Batch。這種訓(xùn)練方式也可以大大緩解內(nèi)存的不足。
Layers
Layers是Caffe框架中網(wǎng)絡(luò)構(gòu)成的重要結(jié)構(gòu)之一,網(wǎng)絡(luò)的構(gòu)成就是因為Layers的作用,通過接收輸入和輸出數(shù)據(jù),最后通過內(nèi)部的計算輸出。Caffe在使用網(wǎng)絡(luò)層的時候,其定義方式特別簡單明了,大致都分為三個小步驟,如下:
1)建立網(wǎng)絡(luò)層,且建立層之間的連接關(guān)系,可以通過隨機(jī)初始化的操作,去對一些網(wǎng)絡(luò)層的變量進(jìn)行初始化;
2)網(wǎng)絡(luò)訓(xùn)練過程中,首先計算前向傳播,在改過過程中Layers接受上一層的輸出數(shù)據(jù)作為本次的輸入數(shù)據(jù),最后通過內(nèi)部
的計算進(jìn)行輸出。
3)前向傳播后,由于得到的結(jié)果與期望相差較大,通過之前提及到的反向傳播來進(jìn)行計算去調(diào)整網(wǎng)絡(luò)的參數(shù)值,以達(dá)到最
優(yōu)值,并且在反向傳播計算時,Layers會把每次計算的梯度值存放在該層中。
Nets
之前介紹的Layers就是Nets的一個子元素,通過多種Layers的組合連接得到整個Nets,在該結(jié)構(gòu)中,Nets定義了網(wǎng)絡(luò)的各 Layers、Input和Output。
例如Caffe定義中最基本的隱層網(wǎng)絡(luò),其定義如下:
- 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優(yōu)勢
-
Caffe作為一個開源的框架,其表達(dá)式的結(jié)構(gòu)得到很多研究學(xué)者的喜愛,因為其可以鼓勵更過的人去進(jìn)行創(chuàng)新、修改完善及實際應(yīng)用。在框架中,網(wǎng)絡(luò)的模型、設(shè)計和優(yōu)化過程都是指令來調(diào)用和執(zhí)行,不像其他工具框架,需要通過硬編碼來獲取相應(yīng)的操作。而且在Caffe應(yīng)用中可以使用CPU中央處理器和GPU圖形圖像處理器進(jìn)行學(xué)習(xí),而且兩個處理器可以來回切換,只要通過在GPU機(jī)器上設(shè)置一個指令就可以,而且GPU的使用在普遍增加,因為其可以給予網(wǎng)絡(luò)的訓(xùn)練速度,減少訓(xùn)練的時間,提高網(wǎng)絡(luò)的訓(xùn)練效率,進(jìn)一步對網(wǎng)絡(luò)進(jìn)行微調(diào)。
-
開源框架的好處就是可以被大家擴(kuò)展,所以Caffe促進(jìn)了其自身的開發(fā),在賈揚清創(chuàng)建Caffe之后,僅在一年時間里,就已經(jīng)有上千位研究愛好者參加了開發(fā),而且他們都做出了很大的貢獻(xiàn)才會有現(xiàn)在完善的深度學(xué)習(xí)框架,現(xiàn)在該框架還在不斷進(jìn)行優(yōu)化和發(fā)展。
-
上手快,因為網(wǎng)絡(luò)模型不需要用代碼的形式表現(xiàn)出來,只需要通過文本形式表現(xiàn),并且Caffe框架中已定義了該模型。
-
Caffe的出現(xiàn)特征事宜學(xué)校機(jī)構(gòu)的實驗室和工業(yè)相關(guān)部門的使用。因為Caffe與英偉達(dá)GPU合用,可以達(dá)到很高的效率。曾有過一個實驗,用一臺英偉達(dá)生產(chǎn)的K40圖形圖像處理器去訓(xùn)練圖片,一天下來可以執(zhí)行六千萬以上的訓(xùn)練圖像。現(xiàn)在其表現(xiàn)的速度,在常用的深度學(xué)習(xí)框架中,可以算得上最快的框架之一。
-
方便快速地使用到其他任務(wù)重,因為Caffe已經(jīng)定義了各層的類型,只需通過簡單調(diào)用來定義自己設(shè)計的網(wǎng)絡(luò)模型即可。
TF
Google在2011年推出人工深度學(xué)習(xí)系統(tǒng)——DistBelief。通過DistBelief,Google能夠掃描數(shù)據(jù)中心數(shù)以千計的核心,并建立更大的神經(jīng)網(wǎng)絡(luò)。這個系統(tǒng)將Google應(yīng)用中的語音識別率提高了25%,以及在Google Photos中建立了圖片搜索,并驅(qū)動了Google的圖片字幕匹配實驗。DistBelief還存在不少不足和限制。它很難被設(shè)置,和Google內(nèi)部的基礎(chǔ)設(shè)施聯(lián)系也過于緊密,這導(dǎo)致研究代碼機(jī)會不可能分享。
針對以上問題,Google在2015年Google Research Blog宣布推出新一代人工智能學(xué)習(xí)系統(tǒng)——TensorFlow。
TensorFlow是一個異構(gòu)分布式系統(tǒng)上的大規(guī)模機(jī)器學(xué)習(xí)框架,移植性好(小到移動設(shè)備如手機(jī),大到大規(guī)模集群,都能支持),支持多種深度學(xué)習(xí)模型。根據(jù)Google說法,TensorFlow是綜合的、靈活的、可移植的、易用的,更為關(guān)鍵的,它是開源的。同時,TensorFlow的速度相比前代DistBelief有了不小的提升,在一些跑分測試中,TensorFlow的得分是第一代系統(tǒng)的兩倍。
盡管如此,TensorFlow的效率仍然比不過其他大部分開源框架。不過,隨著TensorFlow源碼逐步開放,對新硬件、新設(shè)備、新的加速如cuDNN的支持力度不斷提升,其成為目前極具潛力的深度學(xué)習(xí)。
有興趣可以體驗下PlayGround,其是一個用于教學(xué)目的的簡單神經(jīng)網(wǎng)絡(luò)的在線演示、實驗的圖形化平臺,非常強(qiáng)大地可視化了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程。使用它可以在瀏覽器里訓(xùn)練神經(jīng)網(wǎng)絡(luò),對 Tensorflow有一個感性的認(rèn)識。
TF缺點
-
TensorFlow 的每個計算流都必須構(gòu)造為一個靜態(tài)圖,且缺乏符號性循環(huán)(symbolic loops),這會帶來一些計算困難;
-
沒有對視頻識別很有用的三維卷積(3-D convolution);
-
盡管 TensorFlow 現(xiàn)在比起始版本快了 58 倍,但在執(zhí)行性能方面依然落后于競爭對手。
今天就到此位置吧,感覺講的有點多,但是又不是很深入,有機(jī)會來一次深度學(xué)習(xí)工具專題,我們大家一起慢慢聊!