[AI]AI章2 框架比較

深度學習框架比較

神經網絡通常包括:訓練,測試兩大階段。訓練:就是把訓練數據(原料)和神經網絡模型:如AlexNetRNN倒進」 神經網絡訓練框架例如cafffe等而後用 CPUGPU(真火) 「提煉出」 模型參數(仙丹)的過程。測試:就是把測試數據用訓練好的模型(神經網絡模型 + 模型參數)跑一跑看看結果如何,做爲煉丹爐caffekerastensorflow就是把煉製過程所涉及的概念作抽象,造成一套體系。html

(一)Caffe

一、概念介紹

 Caffe是一個清晰而高效的深度學習框架,也是一個被普遍使用的開源深度學習框架,在Tensorflow出現以前一直是深度學習領域Github star最多的項目。node

 Caffe的主要優點爲:容易上手,網絡結構都是以配置文件形式定義,不須要用代碼設計網絡。訓練速度快,組件模塊化,能夠方便的拓展到新的模型和學習任務上。可是Caffe最開始設計時的目標只針對於圖像,沒有考慮文本、語音或者時間序列的數據,所以Caffe對卷積神經網絡的支持很是好,可是對於時間序列RNN,LSTM等支持的不是特別充分。caffe工程的models文件夾中經常使用的網絡模型比較多,好比Lenet、AlexNet、ZFNet、VGGNet、GoogleNet、ResNet等。python

二、Caffe的模塊結構

總的來說,由低到高依次把網絡中的數據抽象成Blob, 各層網絡抽象成 Layer ,整個網絡抽象成Net,網絡模型的求解方法 抽象成 Solver。git

1)       Blob 主要用來表示網絡中的數據,包括訓練數據,網絡各層自身的參數,網絡之間傳遞的數據都是經過 Blob 來實現的,同時 Blob 數據也支持在 CPU 與 GPU 上存儲,可以在二者之間作同步。github

2)       Layer 是對神經網絡中各類層的一個抽象,包括咱們熟知的卷積層和下采樣層,還有全鏈接層和各類激活函數層等等。同時每種 Layer 都實現了前向傳播和反向傳播,並經過 Blob 來傳遞數據。算法

3)       Net 是對整個網絡的表示,由各類 Layer 先後鏈接組合而成,也是咱們所構建的網絡模型。編程

4)       Solver 定義了針對 Net 網絡模型的求解方法,記錄網絡的訓練過程,保存網絡模型參數,中斷並恢復網絡的訓練過程。自定義 Solver 可以實現不一樣的網絡求解方式。windows

 

三、安裝方式

Caffe 須要預先安裝比較多的依賴項,CUDA,snappy,leveldb,gflags,glog,szip,lmdb,OpenCV,hdf5,BLAS,boost等等後端

Caffe官網:http://caffe.berkeleyvision.org/服務器

Caffe Github : https://github.com/BVLC/caffe

Caffe 安裝教程:http://caffe.berkeleyvision.org/installation.html  http://blog.csdn.net/yhaolpz/article/details/71375762

Caffe 安裝分爲CPU和GPU版本,GPU版本須要顯卡支持以及安裝CUDA。

Caffe依賴 ProtoBuffer Boost GFLAGS GLOG BLAS HDF5 OpenCV LMDB LEVELDB Snappy

 

四、使用Caffe搭建神經網絡

表 3-1 caffe搭建神經網絡流程

使用流程

操做說明

一、數據格式處理

將數據處理成caffe支持格式,具體包括:LEVELDB,LMDB,內存數據,hdfs數據,圖像數據,windows,dummy等。

二、編寫網絡結構文件

定義網絡結構,如當前網絡包括哪幾層,每層做用是什麼,使用caffe過程當中最麻煩的一個操做步驟。具體編寫格式可參考caffe框架自帶自動識別手寫體樣例:caffe/examples/mnist/lenet_train_test.prototxt。

三、編寫網絡求解文件

定義了網絡模型訓練過程當中須要設置的參數,好比學習率,權重衰減係數,迭代次數,使用GPU仍是CP等,通常命名方式爲xx_solver.prototxt,可參考:caffe/examples/mnist/lenet_solver.prototxt。

四、訓練

基於命令行的訓練,如:caffe train -solver examples/mnist/lenet_solver.prototxt

五、測試

caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100

在上述流程中,步驟2是核心操做,也是caffe使用最讓人頭痛的地方,keras則對該部分作了更高層的抽象,讓使用者可以快速編寫出本身想要實現的模型。

(二) Tensorflow

一、概念介紹

TensorFlow是一個使用數據流圖進行數值計算的開源軟件庫。圖中的節點表示數學運算,而圖邊表示在它們之間傳遞的多維數據陣列(又稱張量)。靈活的體系結構容許你使用單個API將計算部署到桌面、服務器或移動設備中的一個或多個CPU或GPU。Tensorflow涉及相關概念解釋以下:

 1)符號計算

符號計算首先定義各類變量,而後創建一個「計算圖」,計算圖規定了各個變量之間的計算關係。 符號計算也叫數據流圖,其過程以下圖3-1所示,數據是按圖中黑色帶箭頭的線流動的。

        

                       圖 3-1 數據流圖示例

數據流圖用「結點」(nodes)和「線」(edges)的有向圖來描述數學計算。

①         「節點」 通常用來表示施加的數學操做,但也能夠表示數據輸入(feed in)的起點/輸出(push out)的終點,或者是讀取/寫入持久變量(persistent variable)的終點。

②         「線」表示「節點」之間的輸入/輸出關係。

③         在線上流動的多維數據陣列被稱做「張量」。

2)張量

張量(tensor),能夠看做是向量、矩陣的天然推廣,用來表示普遍的數據類型。張量的階數也叫維度。

0階張量,即標量,是一個數。

1階張量,即向量,一組有序排列的數

2階張量,即矩陣,一組向量有序的排列起來

3階張量,即立方體,一組矩陣上下排列起來

4階張量......

依次類推

3)數據格式(data_format)

目前主要有兩種方式來表示張量:
     ① th模式或channels_first模式,Theano和caffe使用此模式。

② tf模式或channels_last模式,TensorFlow使用此模式。

 

下面舉例說明兩種模式的區別:

 對於100張RGB3通道的16×32(高爲16寬爲32)彩色圖,

 th表示方式:(100,3,16,32)

 tf表示方式:(100,16,32,3)

 惟一的區別就是表示通道個數3的位置不同。

 

二、Tensorflow的模塊結構

Tensorflow/core目錄包含了TF核心模塊代碼,具體結構如圖3-2所示:

 

圖 3-2 tensorflow代碼模塊結構

三、安裝方式

一、官網下載naconda安裝:https://www.anaconda.com/download/

二、依次在Anaconda Prompt控制檯,按如下5個步驟輸入指令進行安裝:

1)        安裝py3+ cmd : conda create -n py3.6 python=3.6 anaconda

2)        激活虛擬環境 cmd : activate py3.6

3)        激活TSF預安裝cmd:

conda create -n tensorflow python=3.6

activate tensorflow

4)        安裝TSF:

pip install --ignore-installed --upgrade tensorflow

pip install --ignore-installed --upgrade tensorflow-gpu

5)        退出虛擬環境cmd :deactivate py3.6      

4、使用Tensorflow搭建神經網絡

使用Tensorflow搭建神經網絡主要包含如下6個步驟:

1)        定義添加神經層的函數

2)        準備訓練的數據

3)        定義節點準備接收數據

4)        定義神經層:隱藏層和預測層

5)        定義 loss 表達式

6)        選擇 optimizer 使 loss 達到最小

7)        對全部變量進行初始化,經過 sess.run optimizer,迭代屢次進行學習。

5、示例代碼

Tensorflow 構建神經網絡識別手寫數字,具體代碼以下所示:

 

複製代碼
import tensorflow as tf
import numpy as np

# 添加層
def add_layer(inputs, in_size, out_size, activation_function=None):
   # add one more layer and return the output of this layer
   Weights = tf.Variable(tf.random_normal([in_size, out_size]))
   biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
   Wx_plus_b = tf.matmul(inputs, Weights) + biases
   if activation_function is None:
       outputs = Wx_plus_b
   else:
       outputs = activation_function(Wx_plus_b)
   return outputs

# 1.訓練的數據
# Make up some real data 
x_data = np.linspace(-1,1,300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise

# 2.定義節點準備接收數據
# define placeholder for inputs to network  
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

# 3.定義神經層:隱藏層和預測層
# add hidden layer 輸入值是 xs,在隱藏層有 10 個神經元   
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer 輸入值是隱藏層 l1,在預測層輸出 1 個結果
prediction = add_layer(l1, 10, 1, activation_function=None)

# 4.定義 loss 表達式
# the error between prediciton and real data    
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                    reduction_indices=[1]))

# 5.選擇 optimizer 使 loss 達到最小                   
# 這一行定義了用什麼方式去減小 loss,學習率是 0.1       
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

# important step 對全部變量進行初始化
init = tf.initialize_all_variables()
sess = tf.Session()
# 上面定義的都沒有運算,直到 sess.run 纔會開始運算
sess.run(init)

# 迭代 1000 次學習,sess.run optimizer
for i in range(1000):
   # training train_step 和 loss 都是由 placeholder 定義的運算,因此這裏要用 feed 傳入參數
   sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
   if i % 50 == 0:
       # to see the step improvement
       print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
複製代碼

 

  

(三) Keras

1、概念介紹

Keras由純Python編寫而成並基於Tensorflow、Theano以及CNTK後端,至關於Tensorflow、Theano、 CNTK的上層接口,號稱10行代碼搭建神經網絡,具備操做簡單、上手容易、文檔資料豐富、環境配置容易等優勢,簡化了神經網絡構建代碼編寫的難度。目前封裝有全鏈接網絡、卷積神經網絡、RNN和LSTM等算法。

Keras有兩種類型的模型,序貫模型(Sequential)和函數式模型(Model),函數式模型應用更爲普遍,序貫模型是函數式模型的一種特殊狀況。

1)        序貫模型(Sequential):單輸入單輸出,一條路通到底,層與層之間只有相鄰關係,沒有跨層鏈接。這種模型編譯速度快,操做也比較簡單

2)        函數式模型(Model):多輸入多輸出,層與層之間任意鏈接。這種模型編譯速度慢。

2Keras的模塊結構

Keras主要由5大模塊構成,模塊之間的關係及每一個模塊的功能如圖3-3所示:

 

圖 3-3 keras模塊結構圖

三、安裝方式

Keras的安裝方式有如下三個步驟:

1)        安裝anaconda(python)

2)        用於科學計算的python發行版,支持Linux、Mac、Windows系統,提供了包管理與環境管理的功能,能夠很方便的解決多版本python並存、切換以及各類第三方包安裝問題。

3)        利用pip或者conda安裝numpy、keras、 pandas、tensorflow等庫

下載地址: https://www.anaconda.com/what-is-anaconda/

4、使用Keras搭建神經網絡

使用keras搭建一個神經網絡,包括5個步驟,分別爲模型選擇、構建網絡層、編譯、訓練和預測。每一個步驟操做過程當中使用到的keras模塊如圖3-4所示。

 

圖 3-4 使用keras搭建神經網絡步驟

6、示例代碼

Kears構建神經網絡識別手寫數字,具體代碼以下所示:

 

複製代碼
from keras.models import Sequential  
from keras.layers.core import Dense, Dropout, Activation  
from keras.optimizers import SGD  
from keras.datasets import mnist  
import numpy 
'''
    第一步:選擇模型
'''
model = Sequential()
'''
   第二步:構建網絡層
'''
model.add(Dense(500,input_shape=(784,))) # 輸入層,28*28=784  
model.add(Activation('tanh')) # 激活函數是tanh  
model.add(Dropout(0.5)) # 採用50%的dropout

model.add(Dense(500)) # 隱藏層節點500個  
model.add(Activation('tanh'))  
model.add(Dropout(0.5))

model.add(Dense(10)) # 輸出結果是10個類別,因此維度是10  
model.add(Activation('softmax')) # 最後一層用softmax做爲激活函數

'''
   第三步:編譯
'''
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) # 優化函數,設定學習率(lr)等參數  
model.compile(loss='categorical_crossentropy', optimizer=sgd, class_mode='categorical') # 使用交叉熵做爲loss函數

'''
   第四步:訓練
   .fit的一些參數
   batch_size:對總的樣本數進行分組,每組包含的樣本數量
   epochs :訓練次數
   shuffle:是否把數據隨機打亂以後再進行訓練
   validation_split:拿出百分之多少用來作交叉驗證
   verbose:屏顯模式 0:不輸出  1:輸出進度  2:輸出每次的訓練結果
'''
(X_train, y_train), (X_test, y_test) = mnist.load_data() # 使用Keras自帶的mnist工具讀取數據(第一次須要聯網)
# 因爲mist的輸入數據維度是(num, 28, 28),這裏須要把後面的維度直接拼起來變成784維  
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2]) 
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])  
Y_train = (numpy.arange(10) == y_train[:, None]).astype(int) 
Y_test = (numpy.arange(10) == y_test[:, None]).astype(int)

model.fit(X_train,Y_train,batch_size=200,epochs=50,shuffle=True,verbose=0,validation_split=0.3)
model.evaluate(X_test, Y_test, batch_size=200, verbose=0)

'''
    第五步:輸出
'''
print("test set")
scores = model.evaluate(X_test,Y_test,batch_size=200,verbose=0)
print("")
print("The test loss is %f" % scores)
result = model.predict(X_test,batch_size=200,verbose=0)

result_max = numpy.argmax(result, axis = 1)
test_max = numpy.argmax(Y_test, axis = 1)

result_bool = numpy.equal(result_max, test_max)
true_num = numpy.sum(result_bool)
print("")
print("The accuracy of the model is %f" % (true_num/len(result_bool)))
複製代碼

 

(四)框架性能及優缺點對比

表 3-2 深度學習框架對比

對比維度

Caffe

Tensorflow

Kears

上手難度

一、     不用不寫代碼,只需在.prototxt文件中定義網絡結構就能夠完成模型訓練。

二、     安裝過程複雜,且在.prototxt 文件內部設計網絡節構比較受限,沒有在 Python 中設計網絡結構方便、自由。配置文件不能用編程的方式調整超參數,對交叉驗證、超參數Grid Search 等操做沒法很方便的支持。

一、     安裝簡單,教學資源豐富,根據樣例能快速搭建出基礎模型。

二、     有必定的使用門檻。不論是編程範式,仍是數學統計基礎,都爲非機器學習與數據科學背景的夥伴們帶來必定的上手難度。另外,是一個相對低層的框架,使用時須要編寫大量的代碼,從新發明輪子。

一、安裝簡單,它旨在讓用戶進行最快速的原型實驗,讓想法變爲結果的這個過程最短,很是適合最前沿的研究。

二、API使用方便,用戶只須要將高級的模塊拼在一塊兒,就能夠設計神經網絡,下降了編程和閱讀別人代碼時的理解開銷

框架維護

在 TensorFlow 出現以前一直是深度學習領域 GitHub star 最多的項目,前由伯克利視覺學中心(Berkeley Vision and Learning Center,BVLC)進行維護。

被定義爲「最流行」、「最被承認」的開源深度學習框架, 擁有產品級的高質量代碼,有 Google 強大的開發、維護能力的加持,總體架構設計也很是優秀。

開發主要由谷歌支持, API以「tf.keras"的形式打包在TensorFlow中。微軟維護着Keras的CNTK後端。亞馬遜AWS正在開發MXNet支持。其餘提供支持的公司包括NVIDIA、優步、蘋果(經過CoreML)

支持語言

C++/Cuda

C++ python (Go,Java,Lua,Javascript,或者是R)

Python

封裝算法

一、對卷積神經網絡的支持很是好,擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其餘 state-of-the-art (ResNet等)的模型,收藏在它的 Model Zoo。

二、對時間序列 RNN、LSTM 等支持得不是特別充分

一、支持CNN與RNN, 還支持深度強化學習乃至其餘計算密集的科學計算(如偏微分方程求解等)。

二、計算圖必須構建爲靜態圖,這讓不少計算變得難以實現,尤爲是序列預測中常用的 beam search。

一、專精於深度學習,支持卷積網絡和循環網絡,支持級聯的模型或任意的圖結構的模型,從 CPU 上計算切換到 GPU 加速無須任何代碼的改動。

二、沒有加強學習工具箱,本身修改實現很麻煩。封裝得過高級,訓練細節不能修改、penalty細節很難修改。

模型部署

一、程序運行很是穩定,代碼質量比較高,很適合對穩定性要求嚴格的生產環境,第一個主流的工業級深度學習框架。Caffe 的底層基於 C++,能夠在各類硬件環境編譯並具備良好的移植性,支持 Linux、Mac 和 Windows 系統,也能夠編譯部署到移動設備系統如 Android 和 iOS 上。

一、爲生產環境設計的高性能的機器學習服務系統,能夠同時運行多個大規模深度學習模型,支持模型生命週期管理、算法實驗,並能夠高效地利用 GPU 資源,讓訓練好的模型更快捷方便地投入到實際生產環境。靈活的移植性,能夠將同一份代碼幾乎不通過修改就輕鬆地部署到有任意數量 CPU 或 GPU 的 PC、服務器或者移動設備上。

一、使用TensorFlow、CNTK、Theano做爲後端,簡化了編程的複雜度,節約了嘗試新網絡結構的時間。模型越複雜,收益越大,尤爲是在高度依賴權值共享、多模型組合、多任務學習等模型上,表現得很是突出。

性能

目前僅支持單機多 GPU 的訓練,不支持分佈式的訓練。

一、     支持分佈式計算,使 GPU 集羣乃至 TPU 集羣並行計算,共同訓練出一個模型。

二、     對不一樣設備間的通訊優化得不是很好,分佈式性能尚未達到最優。

沒法直接使用多 GPU,對大規模的數據處理速度沒有其餘支持多 GPU 和分佈式的框架快。用TensorFLow backend時速度比純TensorFLow 下要慢不少。

如表3-2對比維度所示,對於剛入門機器學習的新手而已,keras無疑是最好的選擇,可以快速搭建模型驗證想法。隨着對機型學習的理解逐步加深,業務模型愈來愈複雜時,能夠根據實際須要轉到Tensorflow或Caffe。

相關文章
相關標籤/搜索