參考網址:http://www.vlfeat.org/matconvnet/
內容參考博客:http://blog.sina.com.cn/s/blog_92cd3a1c0102x1ch.html
MatConvNet安裝:http://www.vlfeat.org/matconvnet/install/ (根據自己的系統配置進行相應的安裝)
摘要
MatConvnet是用matlab實現的卷積神經網絡(CNN),該工具箱的設計注重簡潔性和靈活性。它將CNN的構建模塊公開為易於使用的MATLAB函數,提供用於計算帶有濾波器組的線性卷積、特征池化等例程。通過這種方式,MatConvNet可以快速建立新的CNN結構;同時,它支持CPU和GPU上的高效計算,允許在大型數據集(如ImageNet ILSVRC)上訓練復雜模型。本文檔概述了CNN及其在MatConvNet中如何實現,並給出了工具箱中每個計算模塊的技術細節。
第一章 MatConvnet介紹
MatConvNet是一個實現卷積神經網絡(CNN)的MATLAB工具箱,用於計算機視覺應用。自從工作[8]的突破,CNNs在計算機視覺領域產生了重大影響,特別是在圖像理解方面,基本上是取代傳統的圖像表示,例如在我們自己的VLFeat [13]中實現的開源庫。
雖然大多數CNN是通過組合簡單的線性和非線性濾波操作(例如卷積和整形)來獲得的,但是它們的實現是非常重要的。原因是為了獲得非常有效的實現,CNNs需要從大量的數據中學習,經常是數百萬的圖像。作為大多數CNN庫,MatConvNet通過使用各種優化來實現這一點,主要是通過支持GPU上的計算。
除此之外,還有許多其他的機器學習,深度學習和CNN開源庫存在。引用其中一些最受歡迎的:CudaConvNet(https://code.google.com/p/cuda-convnet/)、Torch(http://cilvr.nyu.edu/doku.php?id=code:start)、Theano(http://deeplearning.net/software/theano/)以及caffe(http://caffe.berkeleyvision.org)。這些庫中許多得到很好的支持,有幾十個活躍的貢獻者和大量的用戶基礎。因此,為什么還要創建另外一個庫呢?
開發MatConvNet的關鍵動機是為研究人員提供一個特別友好和有效的環境,以便在其調查中使用。MatConvnet通過其在MATLAB環境中的深度集成實現了這一點,這是計算機視覺研究以及許多其他領域最受歡迎的開發環境之一。特別是,MatConvNet公開了簡單的MATLAB命令來實現CNN構建塊,如卷積,歸一化和池化(第4章);這些塊可以很容易地組合和擴展以創建CNN結構。雖然許多這樣的塊使用用C ++和CUDA編寫的優化的CPU和GPU實現(第1.4節)。 MATLAB本機支持GPU計算意味着通常在MATLAB中直接寫入新的模塊是可能的,同時保持計算效率。與使用低級語言編寫新的CNN組成結構相比,這是一個重要的簡化,可以顯着加速測試新的想法。使用MATLAB還提供了一個到其他領域的橋梁; 例如,MatConvNet最近被亞利桑那大學用於行星科學,如NVIDIA博客網站所述。
MatConvNet可以從輸完圖片中學習大的CNN模型,如AlexNet[8]和非常深的網絡[11]。可以從MatConvNet主頁下載這些強大模型的預訓練版本。雖然功能強大,但是MatConvNet仍然很容易使用和安裝。實現是完全獨立的,只需要MATLAB和兼容的C ++編譯器(使用GPU代碼需要免費提供的CUDA開發套件和合適的NVIDIA GPU)。如圖 1.1和第1.1節所示,可以使用三個MATLAB命令下載,編譯和安裝MatConvNet。其中包括了幾個完整功能的示例,演示如何可以學習小型和大型網絡。重要的是,幾個標准的預訓練網絡可以立即下載並在應用程序中使用。該工具箱的完整技術說明手冊也包含在此工具箱中。這些功能使MatConvNet在教育領域也很有用。
MatConvNet是根據BSD類似許可證開放源代碼。可從http://www.vlfeat.org/matconvnet以及GitHub上下載。
1.1 開始運行
MatConvNet易於安裝和使用。圖1.1提供了一個完整的示例,即使用最新一代的卷積神經網絡來對一張圖片進行分類。該示例包含下載MatConvNet,編譯包,下載一個預訓練的CNN模型,以及在MATLAB的某個庫存圖像上評估該模型。
在這個例子中的關鍵命令是vl_simplenn,一個包裝器,它將CNN網絡和預處理圖像im_作為輸入,並產生結果的結構res。該特定封裝可以用於對具有簡單結構,即操作鏈的網絡建模。 檢查vl_simplenn(在MatConvNet中編輯vl_simplenn)的代碼,我們注意到封裝順序地轉換數據,應用網絡配置指定的多個MATLAB函數。 這些函數,在第4章中詳細討論,被稱為“構建塊”,並構成MatConvNet的骨架。
雖然大多數塊實現簡單的操作,但使得它們不平凡的是它們的效率(第1.4節)以及支持反向傳播(第2.3節),以允許學習CNN。接下來,我們演示如何直接使用這樣的構建塊之一。 為了示例的目的,考慮使用一組線性濾波器對圖像進行卷積。 首先,通過在MATLAB中讀取圖像,例如使用im = single(imread('peppers.png')),獲得H×W×D數組im,其中D = 3是圖像中的顏色通道的數量。 然后使用f = randn(3,3,3,16,'single')創建一個大小為3×3的K = 16個隨機濾波器組。最后,使用命令y = vl_nnconv(x,f,[])將圖像與濾波器進行卷積。 這產生了具有K個通道的陣列y,濾波器組中的每一個在陣列中都有一個通道。
為了鼓勵用戶直接使用塊來創建新的架構,MATLAB提供了封裝,如vl_simplenn用於標准CNN結構,如AlexNet [8]或Network-in-Network [9]。 此外,庫提供了許多示例(在examples /子目錄中),包含了在MNIST,CIFAR和ImageNet數據集上學習各種模型的代碼。所有這些示例使用examples / cnn_train訓練代碼,它是隨機梯度下降的實現(第3.3節)。 雖然這個訓練代碼是完全可維護的和相當靈活的,它仍然在examples/子目錄,因為它有點問題特定。歡迎用戶對他們的實施優化。
(注:運行下列代碼之前,需按照http://www.vlfeat.org/matconvnet/install/#compiling 所述通過編譯。)
1 % install and compile MatConvNet (run once) 2 untar(['http://www.vlfeat.org/matconvnet/download/' ... 3 'matconvnet-1.0-beta25.tar.gz']) ; 4 cd matconvnet-1.0-beta25 5 run matlab/vl_compilenn 6 7 % download a pre?trained CNN from the web (run once) 8 urlwrite(... 9 'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ... 10 'imagenet-vgg-f.mat') ; 11 % setup MatConvNet 12 run matlab/vl_setupnn 13 % load the pre?trained CNN 14 net = load('imagenet-vgg-f.mat') ; 15 % load and preprocess an image 16 im = imread('peppers.png') ; 17 im_ = imresize(single(im), net.meta.normalization.imageSize(1:2)) ; 18 im_ = im_ - net.meta.normalization.averageImage ; 19 % run the CNN 20 res = vl_simplenn(net, im_) ; 21 % show the classification result 22 scores = squeeze(gather(res(end).x)) ; 23 [bestScore, best] = max(scores) ; 24 figure(1) ; clf ; imagesc(im) ; 25 title(sprintf('%s (%d), score %.3f',... 26 net.meta.classes.description{best}, best, bestScore)) ; %%注:官方代碼是net.classes.description,需要加上meta
運行結果如下:
1.2 MatConvNet概覽
MatConvNet有一個簡單的設計原則。它不是將CNN包裹在軟件的復雜層上,而是開放了直接作為MATLAB命令的計算CNN模塊的簡單函數,例如線性卷積和ReLU操作。這些模塊易於組合成完整的CNN,並且可以用於實現復雜的學習算法。雖然提供了小型和大型CNN結構和預訓練例程的幾個實際例子,但總是可以回到基礎並構建自己的結構,使用MATLAB在原型中的效率。通常不需要C編碼來嘗試新的結構。因此,MatConvNet是計算機視覺和CNNs研究的理想平台。
MatConvNet包含了以下元素:
CNN計算塊 一組計算CNN的基本模塊的優化例程。例如,卷積模塊是由y = vl_nnconv(x,f,b)實現,其中x是圖像,f是濾波器組,b是偏置矢量(第4.1節)。導數可由[dzdx,dzdf,dzdb] = vl_nnconv(x,f,b,dzdy)計算,其中dzdy是CNN輸出w.r.t y的導數(第4.1節)。第4章詳細描述了所有塊。
CNN封裝. MatConvNet提供了一個簡單的封裝,由vl_simplenn調用,其實現具有線性拓撲(塊鏈塊)的CNN。 它還提供了一個更靈活的封裝,支持具有任意拓撲的網絡,封裝在dagnn.DagNN MATLAB類中。
示例應用程序.MatConvNet提供了幾個在MNIST,CIFAR 10和ImageNet數據集上學習具有隨機梯度下降和CPU或GPU的CNN的示例。
預先訓練的模型.MatConvNet提供了幾個先進的預訓練的CNN模型,可以使用現成的,以分類圖像或者在Caffe或DeCAF環境中生成圖像編碼。
1.3 文檔和示例
有三個關於MatConvNet的主要信息來源:
首先,網站包含所有功能的描述和若干例子和教程。
第二,有一個PDF手冊,其中包含大量有關工具箱的技術細節,包括對構建塊的詳細數學描述。
第三,MatConvNet附有幾個例子(第1.1節)。
大多數示例是完全自包含的。例如,為了運行MNIST示例,它支持將MATLAB指向MatConvNet根目錄,並鍵入addpath←examples,后跟cnn_mnist。根據問題的大小,Image Net ILSVRC示例需要一些更多准備,包括下載和預處理圖像(使用附帶的腳本utils / preprocess-imagenet.sh)。還包括幾個高級示例。例如, 圖1.2說明了top-1和top-5驗證錯誤,因為類似於Alex Net [8]的模型使用標准dropout正規化或最近的批次標准化技術[3]進行訓練。后者被示為在前者所需的約三分之一的epochs(通過訓練數據)中收斂。
MatConvNet網站還包含許多預訓練模型,即在Image Net ILSVRC上訓練的大型CNN,可以下載並用作許多其他問題的起點[1]。 這些包括:AlexNet [7],VGG-S,VGG-M,VGG-S [1]和VGG-VD-16和VGG-VD-19 [11]。圖1.1的示例代碼顯示了一個這樣的模型如何在幾行MATLAB代碼中使用。
1.4 速度
效率對於CNN的工作非常重要。 MatConvNet支持使用NVIDIA GPU,因為它包括所有算法的CUDA實現(或依賴於MATLAB CUDA支持)。
要使用GPU(假設有合適的硬件可用,並且工具箱已經在GPU支持下編譯),只需要在MATLAB中將參數轉換為gpuArrays,如y = vl_nnconv(gpu Array(x),gpu Array(w),[])。以這種方式,CPU和GPU之間的切換是完全透明的。 請注意,MatConvNet還可以利用NVIDIA CuDNN庫,具有顯着的速度和空間優勢。
接下來,我們評估MatConvNet在Image Net ILSVRC 2012挑戰數據上訓練大型架構時的性能[2]。測試機器是一台戴爾服務器,配有兩個采用3.30 GHz時鍾頻率的Intel Xeon CPU E5-2667 v2(每個CPU有八個內核),256 GB RAM和四個NVIDIA Titan Black GPU(除非另有說明,否則只使用其中一個) 。實驗使用MatConvNet beta12,Cu DNN v2和MATLAB R2015a。數據被預處理以避免在MATLAB中飛快地重新縮放圖像並存儲在RAM盤中以便更快地訪問。該代碼使用vl_imreadjpeg命令在多個單獨的線程中從磁盤讀取大批量的JPEG圖像。驅動程序examples/ cnn_imagenet.m用於所有實驗。
我們訓練在Image Net ILSVRC第1.3節中討論的模型。表1.1報告了隨機梯度下降處理的每秒圖像數量的訓練速度。 Alex Net以大約264張圖像/ s使用Cu DNN進行訓練,這比使用Cu BLAS的vanilla GPU實現快40%,比使用CPU快10多倍。此外,我們注意到,盡管MATLAB開銷,實現速度與Caffe相當(他們報告Cu DNN和Titan每秒253圖像 - 一個比這里使用的Titan Black略慢的GPU)。還要注意,隨着模型大小的增加,SGD批次的大小必須減小(以適應GPU內存),從而增加了開銷影響。
表1.2報告了使用多個GPU的VGG-VD-16(一個非常大的模型)的速度。在這種情況下,批量大小設置為264個圖像。這些被進一步划分為22個圖像的子批次,每個圖像適合於GPU存儲器;然后將后者分布在同一機器上的一至四個GPU中。雖然存在大量的通信開銷,但是訓練速度從20個圖像/秒增加到45.解決這個開銷是代碼庫的中期目標之一。
1.5 致謝
MatConvNet是一個社區項目,因此感謝所有的貢獻者。我們衷心感謝NVIDIA為此項目提供支持,為我們提供了頂級的GPU和MathWorks,以便持續討論如何改進庫。 在這個庫中的幾個CNN計算的實現靈感來自Caffe庫[6](然而,並不依賴於Caffe)。 幾個示例網絡已經由Karen Simonyan作為[1]和[11]的一部分拿來訓練。