Matconvnet笔记(一)
參考網(wǎng)址:http://www.vlfeat.org/matconvnet/
內(nèi)容參考博客:http://blog.sina.com.cn/s/blog_92cd3a1c0102x1ch.html
MatConvNet安裝:http://www.vlfeat.org/matconvnet/install/(根據(jù)自己的系統(tǒng)配置進(jìn)行相應(yīng)的安裝)
摘要
MatConvnet是用matlab實(shí)現(xiàn)的卷積神經(jīng)網(wǎng)絡(luò)(CNN),該工具箱的設(shè)計(jì)注重簡(jiǎn)潔性和靈活性。它將CNN的構(gòu)建模塊公開為易于使用的MATLAB函數(shù),提供用于計(jì)算帶有濾波器組的線性卷積、特征池化等例程。通過這種方式,MatConvNet可以快速建立新的CNN結(jié)構(gòu);同時(shí),它支持CPU和GPU上的高效計(jì)算,允許在大型數(shù)據(jù)集(如ImageNet ILSVRC)上訓(xùn)練復(fù)雜模型。本文檔概述了CNN及其在MatConvNet中如何實(shí)現(xiàn),并給出了工具箱中每個(gè)計(jì)算模塊的技術(shù)細(xì)節(jié)。
第一章 MatConvnet介紹
MatConvNet是一個(gè)實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)(CNN)的MATLAB工具箱,用于計(jì)算機(jī)視覺應(yīng)用。自從工作[8]的突破,CNNs在計(jì)算機(jī)視覺領(lǐng)域產(chǎn)生了重大影響,特別是在圖像理解方面,基本上是取代傳統(tǒng)的圖像表示,例如在我們自己的VLFeat [13]中實(shí)現(xiàn)的開源庫(kù)。
雖然大多數(shù)CNN是通過組合簡(jiǎn)單的線性和非線性濾波操作(例如卷積和整形)來獲得的,但是它們的實(shí)現(xiàn)是非常重要的。原因是為了獲得非常有效的實(shí)現(xiàn),CNNs需要從大量的數(shù)據(jù)中學(xué)習(xí),經(jīng)常是數(shù)百萬的圖像。作為大多數(shù)CNN庫(kù),MatConvNet通過使用各種優(yōu)化來實(shí)現(xiàn)這一點(diǎn),主要是通過支持GPU上的計(jì)算。
除此之外,還有許多其他的機(jī)器學(xué)習(xí),深度學(xué)習(xí)和CNN開源庫(kù)存在。引用其中一些最受歡迎的: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)。這些庫(kù)中許多得到很好的支持,有幾十個(gè)活躍的貢獻(xiàn)者和大量的用戶基礎(chǔ)。因此,為什么還要?jiǎng)?chuàng)建另外一個(gè)庫(kù)呢?
開發(fā)MatConvNet的關(guān)鍵動(dòng)機(jī)是為研究人員提供一個(gè)特別友好和有效的環(huán)境,以便在其調(diào)查中使用。MatConvnet通過其在MATLAB環(huán)境中的深度集成實(shí)現(xiàn)了這一點(diǎn),這是計(jì)算機(jī)視覺研究以及許多其他領(lǐng)域最受歡迎的開發(fā)環(huán)境之一。特別是,MatConvNet公開了簡(jiǎn)單的MATLAB命令來實(shí)現(xiàn)CNN構(gòu)建塊,如卷積,歸一化和池化(第4章);這些塊可以很容易地組合和擴(kuò)展以創(chuàng)建CNN結(jié)構(gòu)。雖然許多這樣的塊使用用C ++和CUDA編寫的優(yōu)化的CPU和GPU實(shí)現(xiàn)(第1.4節(jié))。 MATLAB本機(jī)支持GPU計(jì)算意味著通常在MATLAB中直接寫入新的模塊是可能的,同時(shí)保持計(jì)算效率。與使用低級(jí)語言編寫新的CNN組成結(jié)構(gòu)相比,這是一個(gè)重要的簡(jiǎn)化,可以顯著加速測(cè)試新的想法。使用MATLAB還提供了一個(gè)到其他領(lǐng)域的橋梁; 例如,MatConvNet最近被亞利桑那大學(xué)用于行星科學(xué),如NVIDIA博客網(wǎng)站所述。
MatConvNet可以從輸完圖片中學(xué)習(xí)大的CNN模型,如AlexNet[8]和非常深的網(wǎng)絡(luò)[11]??梢詮腗atConvNet主頁(yè)下載這些強(qiáng)大模型的預(yù)訓(xùn)練版本。雖然功能強(qiáng)大,但是MatConvNet仍然很容易使用和安裝。實(shí)現(xiàn)是完全獨(dú)立的,只需要MATLAB和兼容的C ++編譯器(使用GPU代碼需要免費(fèi)提供的CUDA開發(fā)套件和合適的NVIDIA GPU)。如圖 1.1和第1.1節(jié)所示,可以使用三個(gè)MATLAB命令下載,編譯和安裝MatConvNet。其中包括了幾個(gè)完整功能的示例,演示如何可以學(xué)習(xí)小型和大型網(wǎng)絡(luò)。重要的是,幾個(gè)標(biāo)準(zhǔn)的預(yù)訓(xùn)練網(wǎng)絡(luò)可以立即下載并在應(yīng)用程序中使用。該工具箱的完整技術(shù)說明手冊(cè)也包含在此工具箱中。這些功能使MatConvNet在教育領(lǐng)域也很有用。
MatConvNet是根據(jù)BSD類似許可證開放源代碼??蓮膆ttp://www.vlfeat.org/matconvnet以及GitHub上下載。
1.1 開始運(yùn)行
MatConvNet易于安裝和使用。圖1.1提供了一個(gè)完整的示例,即使用最新一代的卷積神經(jīng)網(wǎng)絡(luò)來對(duì)一張圖片進(jìn)行分類。該示例包含下載MatConvNet,編譯包,下載一個(gè)預(yù)訓(xùn)練的CNN模型,以及在MATLAB的某個(gè)庫(kù)存圖像上評(píng)估該模型。
在這個(gè)例子中的關(guān)鍵命令是vl_simplenn,一個(gè)包裝器,它將CNN網(wǎng)絡(luò)和預(yù)處理圖像im_作為輸入,并產(chǎn)生結(jié)果的結(jié)構(gòu)res。該特定封裝可以用于對(duì)具有簡(jiǎn)單結(jié)構(gòu),即操作鏈的網(wǎng)絡(luò)建模。 檢查vl_simplenn(在MatConvNet中編輯vl_simplenn)的代碼,我們注意到封裝順序地轉(zhuǎn)換數(shù)據(jù),應(yīng)用網(wǎng)絡(luò)配置指定的多個(gè)MATLAB函數(shù)。 這些函數(shù),在第4章中詳細(xì)討論,被稱為“構(gòu)建塊”,并構(gòu)成MatConvNet的骨架。
雖然大多數(shù)塊實(shí)現(xiàn)簡(jiǎn)單的操作,但使得它們不平凡的是它們的效率(第1.4節(jié))以及支持反向傳播(第2.3節(jié)),以允許學(xué)習(xí)CNN。接下來,我們演示如何直接使用這樣的構(gòu)建塊之一。 為了示例的目的,考慮使用一組線性濾波器對(duì)圖像進(jìn)行卷積。 首先,通過在MATLAB中讀取圖像,例如使用im = single(imread('peppers.png')),獲得H×W×D數(shù)組im,其中D = 3是圖像中的顏色通道的數(shù)量。 然后使用f = randn(3,3,3,16,'single')創(chuàng)建一個(gè)大小為3×3的K = 16個(gè)隨機(jī)濾波器組。最后,使用命令y = vl_nnconv(x,f,[])將圖像與濾波器進(jìn)行卷積。這產(chǎn)生了具有K個(gè)通道的陣列y,濾波器組中的每一個(gè)在陣列中都有一個(gè)通道。
為了鼓勵(lì)用戶直接使用塊來創(chuàng)建新的架構(gòu),MATLAB提供了封裝,如vl_simplenn用于標(biāo)準(zhǔn)CNN結(jié)構(gòu),如AlexNet [8]或Network-in-Network [9]。此外,庫(kù)提供了許多示例(在examples /子目錄中),包含了在MNIST,CIFAR和ImageNet數(shù)據(jù)集上學(xué)習(xí)各種模型的代碼。所有這些示例使用examples / cnn_train訓(xùn)練代碼,它是隨機(jī)梯度下降的實(shí)現(xiàn)(第3.3節(jié))。雖然這個(gè)訓(xùn)練代碼是完全可維護(hù)的和相當(dāng)靈活的,它仍然在examples/子目錄,因?yàn)樗悬c(diǎn)問題特定。歡迎用戶對(duì)他們的實(shí)施優(yōu)化。
(注:運(yùn)行下列代碼之前,需按照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
運(yùn)行結(jié)果如下:
1.2 MatConvNet概覽
MatConvNet有一個(gè)簡(jiǎn)單的設(shè)計(jì)原則。它不是將CNN包裹在軟件的復(fù)雜層上,而是開放了直接作為MATLAB命令的計(jì)算CNN模塊的簡(jiǎn)單函數(shù),例如線性卷積和ReLU操作。這些模塊易于組合成完整的CNN,并且可以用于實(shí)現(xiàn)復(fù)雜的學(xué)習(xí)算法。雖然提供了小型和大型CNN結(jié)構(gòu)和預(yù)訓(xùn)練例程的幾個(gè)實(shí)際例子,但總是可以回到基礎(chǔ)并構(gòu)建自己的結(jié)構(gòu),使用MATLAB在原型中的效率。通常不需要C編碼來嘗試新的結(jié)構(gòu)。因此,MatConvNet是計(jì)算機(jī)視覺和CNNs研究的理想平臺(tái)。
MatConvNet包含了以下元素:
CNN計(jì)算塊一組計(jì)算CNN的基本模塊的優(yōu)化例程。例如,卷積模塊是由y = vl_nnconv(x,f,b)實(shí)現(xiàn),其中x是圖像,f是濾波器組,b是偏置矢量(第4.1節(jié))。導(dǎo)數(shù)可由[dzdx,dzdf,dzdb] = vl_nnconv(x,f,b,dzdy)計(jì)算,其中dzdy是CNN輸出w.r.t y的導(dǎo)數(shù)(第4.1節(jié))。第4章詳細(xì)描述了所有塊。
CNN封裝. MatConvNet提供了一個(gè)簡(jiǎn)單的封裝,由vl_simplenn調(diào)用,其實(shí)現(xiàn)具有線性拓?fù)洌▔K鏈塊)的CNN。 它還提供了一個(gè)更靈活的封裝,支持具有任意拓?fù)涞木W(wǎng)絡(luò),封裝在dagnn.DagNN
MATLAB類中。
示例應(yīng)用程序.MatConvNet提供了幾個(gè)在MNIST,CIFAR 10和ImageNet數(shù)據(jù)集上學(xué)習(xí)具有隨機(jī)梯度下降和CPU或GPU的CNN的示例。
預(yù)先訓(xùn)練的模型.MatConvNet提供了幾個(gè)先進(jìn)的預(yù)訓(xùn)練的CNN模型,可以使用現(xiàn)成的,以分類圖像或者在Caffe或DeCAF環(huán)境中生成圖像編碼。
1.3 文檔和示例
有三個(gè)關(guān)于MatConvNet的主要信息來源:
首先,網(wǎng)站包含所有功能的描述和若干例子和教程。
第二,有一個(gè)PDF手冊(cè),其中包含大量有關(guān)工具箱的技術(shù)細(xì)節(jié),包括對(duì)構(gòu)建塊的詳細(xì)數(shù)學(xué)描述。
第三,MatConvNet附有幾個(gè)例子(第1.1節(jié))。
大多數(shù)示例是完全自包含的。例如,為了運(yùn)行MNIST示例,它支持將MATLAB指向MatConvNet根目錄,并鍵入addpath←examples,后跟cnn_mnist。根據(jù)問題的大小,Image
Net ILSVRC示例需要一些更多準(zhǔn)備,包括下載和預(yù)處理圖像(使用附帶的腳本utils / preprocess-imagenet.sh)。還包括幾個(gè)高級(jí)示例。例如, 圖1.2說明了top-1和top-5驗(yàn)證錯(cuò)誤,因?yàn)轭愃朴贏lex Net
[8]的模型使用標(biāo)準(zhǔn)dropout正規(guī)化或最近的批次標(biāo)準(zhǔn)化技術(shù)[3]進(jìn)行訓(xùn)練。后者被示為在前者所需的約三分之一的epochs(通過訓(xùn)練數(shù)據(jù))中收斂。
MatConvNet網(wǎng)站還包含許多預(yù)訓(xùn)練模型,即在Image Net
ILSVRC上訓(xùn)練的大型CNN,可以下載并用作許多其他問題的起點(diǎn)[1]。 這些包括:AlexNet
[7],VGG-S,VGG-M,VGG-S [1]和VGG-VD-16和VGG-VD-19
[11]。圖1.1的示例代碼顯示了一個(gè)這樣的模型如何在幾行MATLAB代碼中使用。
1.4 速度
效率對(duì)于CNN的工作非常重要。 MatConvNet支持使用NVIDIA GPU,因?yàn)樗ㄋ兴惴ǖ腃UDA實(shí)現(xiàn)(或依賴于MATLAB CUDA支持)。
要使用GPU(假設(shè)有合適的硬件可用,并且工具箱已經(jīng)在GPU支持下編譯),只需要在MATLAB中將參數(shù)轉(zhuǎn)換為gpuArrays,如y = vl_nnconv(gpu Array(x),gpu Array(w),[])。以這種方式,CPU和GPU之間的切換是完全透明的。 請(qǐng)注意,MatConvNet還可以利用NVIDIA CuDNN庫(kù),具有顯著的速度和空間優(yōu)勢(shì)。
接下來,我們?cè)u(píng)估MatConvNet在Image Net ILSVRC 2012挑戰(zhàn)數(shù)據(jù)上訓(xùn)練大型架構(gòu)時(shí)的性能[2]。測(cè)試機(jī)器是一臺(tái)戴爾服務(wù)器,配有兩個(gè)采用3.30 GHz時(shí)鐘頻率的Intel Xeon CPU E5-2667 v2(每個(gè)CPU有八個(gè)內(nèi)核),256 GB RAM和四個(gè)NVIDIA Titan Black GPU(除非另有說明,否則只使用其中一個(gè)) 。實(shí)驗(yàn)使用MatConvNet beta12,Cu DNN v2和MATLAB R2015a。數(shù)據(jù)被預(yù)處理以避免在MATLAB中飛快地重新縮放圖像并存儲(chǔ)在RAM盤中以便更快地訪問。該代碼使用vl_imreadjpeg命令在多個(gè)單獨(dú)的線程中從磁盤讀取大批量的JPEG圖像。驅(qū)動(dòng)程序examples/ cnn_imagenet.m用于所有實(shí)驗(yàn)。
我們訓(xùn)練在Image Net ILSVRC第1.3節(jié)中討論的模型。表1.1報(bào)告了隨機(jī)梯度下降處理的每秒圖像數(shù)量的訓(xùn)練速度。 Alex Net以大約264張圖像/ s使用Cu DNN進(jìn)行訓(xùn)練,這比使用Cu BLAS的vanilla GPU實(shí)現(xiàn)快40%,比使用CPU快10多倍。此外,我們注意到,盡管MATLAB開銷,實(shí)現(xiàn)速度與Caffe相當(dāng)(他們報(bào)告Cu DNN和Titan每秒253圖像 - 一個(gè)比這里使用的Titan Black略慢的GPU)。還要注意,隨著模型大小的增加,SGD批次的大小必須減?。ㄒ赃m應(yīng)GPU內(nèi)存),從而增加了開銷影響。
表1.2報(bào)告了使用多個(gè)GPU的VGG-VD-16(一個(gè)非常大的模型)的速度。在這種情況下,批量大小設(shè)置為264個(gè)圖像。這些被進(jìn)一步劃分為22個(gè)圖像的子批次,每個(gè)圖像適合于GPU存儲(chǔ)器;然后將后者分布在同一機(jī)器上的一至四個(gè)GPU中。雖然存在大量的通信開銷,但是訓(xùn)練速度從20個(gè)圖像/秒增加到45.解決這個(gè)開銷是代碼庫(kù)的中期目標(biāo)之一。
1.5 致謝
MatConvNet是一個(gè)社區(qū)項(xiàng)目,因此感謝所有的貢獻(xiàn)者。我們衷心感謝NVIDIA為此項(xiàng)目提供支持,為我們提供了頂級(jí)的GPU和MathWorks,以便持續(xù)討論如何改進(jìn)庫(kù)。
在這個(gè)庫(kù)中的幾個(gè)CNN計(jì)算的實(shí)現(xiàn)靈感來自Caffe庫(kù)[6](然而,并不依賴于Caffe)。 幾個(gè)示例網(wǎng)絡(luò)已經(jīng)由Karen
Simonyan作為[1]和[11]的一部分拿來訓(xùn)練。
總結(jié)
以上是生活随笔為你收集整理的Matconvnet笔记(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL递归查询(with as)
- 下一篇: linux中安装firebird