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 倍,但在執行效能方面依然落後於競爭對手。
今天就到此位置吧,感覺講的有點多,但是又不是很深入,有機會來一次深度學習工具專題,我們大家一起慢慢聊!
溫馨提示
如果你喜歡本文,請分享到朋友圈,想要獲得更多資訊,請關注 我。