天天看點

第1章 MatConvNet簡介

正文

MatConvNet是一個實作用于計算機視覺應用的卷積神經網絡(CNN)的MATLAB工具箱。自從[8]的突破性工作以來,CNN在計算機視覺和特别是圖像了解方面産生了重大影響,從本質上取代了傳統的圖像表示,例如我們自己的VLFeat [13]開源庫中實作的圖像表示。雖然大多數CNN是通過構造簡單的線性和非線性濾波操作(如卷積和整形)來獲得的,但它們的實作并不是微不足道的。原因是CNN需要從大量資料中學習,通常需要數百萬的圖像,這需要非常有效的實作。作為大多數CNN庫,MatConvNet通過使用各種優化和支援,通過支援GPU上的計算來實作這一點。還有許多其他機器學習,深度學習和CNN開源庫。引用一些最流行的:CudaConvNet1,Torch2 ,Theano3和Caffe4。許多這些圖書館得到了很好的支援,有數十個積極的貢獻者和龐大的使用者群。是以,為什麼要建立另一個庫?開發MatConvNet的關鍵動機是為研究人員提供一個特别友好和有效的環境5,以供研究人員在他們的研究中使用。MatConvNet通過深入內建在MATLAB環境中實作了這一點,該環境是計算機視覺研究中最流行的開發環境之一,和其他許多領域一樣。特别是,MatConvNet公開了簡單的MATLAB指令CNN建構塊,如卷積,規範化和池化(第4章);這些可以随後進行組合和擴充,輕松建立CNN結構。盡管許多這樣的子產品使用了用C ++和CUDA編寫的優化的CPU和GPU實作(1.4節),但對GPU計算的MATLAB原生支援意味着通常可以在MATLAB中直接編寫新子產品,同時保持計算效率。與使用低級語言編寫新的CNN元件相比,這是一個重要的簡化,可以顯着加速測試新想法。使用MATLAB還提供了一個通往其他領域的橋梁;例如,MatConvNet最近被亞利桑那大學用于行星科學,正如本NVIDIA部落格文章所總結的那樣。6

MatConvNet可以從數百萬的圖像中學習大型CNN模型,如AlexNet [8]和[11]的非常深的網絡。這些功能強大的模型的預訓練版本可以從MatConvNet首頁7下載下傳。雖然功能強大,但MatConvNet仍然易于使用和安裝。這個實作是完全獨立的,隻需要MATLAB和一個相容的C ++編譯器(使用GPU代碼需要免費提供的CUDA DevKit和一個合适的NVIDIA GPU)。如圖所示。 1.1和1.1節,可以使用三個MATLAB指令下載下傳,編譯和安裝MatConvNet。包括幾個功能完整的示例,示範如何學習小型和大型網絡。重要的是,幾個标準的預先訓練好的網絡可以立即下載下傳并用于應用程式。一本包含工具箱完整技術說明的手冊與工具箱一起維護。這些特性使得MatConvNet在教育環境中也很有用。9

MatConvNet是一種類似BSD的許可證釋出的開源軟體。它可以從http://www.vlfeat.org/matconvnet和GitHub.10下載下傳。

1https://code.google.com/p/cuda-convnet/    
2http://cilvr.nyu.edu/doku.php?id=code:start    3http://deeplearning.net/software/theano/     
4http://caffe.berkeleyvision.org     
5從使用者的角度來看,MatConvNet目前依賴于Matlab,該庫是在MATLAB代碼與C++和CUDA核之間的幹淨分離中開發的,是以,在将來,該庫可以擴充以獨立于Matlab處理卷積網絡。
           

1.1 入門

MatConvNet易于安裝和使用。圖1.1提供了一個使用最新一代深度卷積神經網絡對圖像進行分類的完整示例。這個例子包括下載下傳MatConvNet,編譯軟體包,下載下傳預先訓練的CNN模型,以及在MATLAB的一張股票圖像上評估後者。本例中的關鍵指令是vl_simplenn,它是一個包裝器,它将CNN網絡和預處理圖像im_作為輸入,并生成結果的結構res作為輸出。這個特定的包裝器可以用來建構具有簡單結構的網絡,即一系列操作。檢查vl_simplenn的代碼(在MatConvNet中編輯vl_simplenn)我們注意到wrapper依次轉換資料,應用網絡配置指定的許多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為諸如AlexNet [8]或Network-in-Network [9]等标準CNN結構提供了諸如vl_simplenn之類的包裝器。此外,該庫提供了大量示例(在examples/子目錄中),包括學習MNIST,CIFAR和ImageNet資料集上各種模型的代碼。所有這些例子都使用examples / cnn_train訓練代碼,這是一個随機梯度下降(3.3節)的實作。 雖然這個訓練代碼可以完美的使用并且十分靈活,但由于存在一些特定問題,它仍然保留在examples/子目錄中。歡迎使用者實作自己的優化器。

% install and compile MatConvNet (run once) 
untar(['http://www.vlfeat.org/matconvnet/download/matconvnet-1.0-beta25.tar.gz']) ; 
cd matconvnet-1.0-beta25 run matlab/vl_compilenn 
% download a preetrained CNN from the web (run once) 
urlwrite(... 'http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.mat', ... 'imagenet-vgg-f.mat') ; 

% setup MatConvNet
run matlab/vl_setupnn 

% load the preetrained CNN 
net = load('imagenet-vgg-f.mat') ; 

% load and preprocess an image 
im = imread('peppers.png') ; 
im_ = imresize(single(im), net.meta.normalization.imageSize(1:2)) ; 
im_ = im_ - net.meta.normalization.averageImage;

% run the CNN                                    
res = vl_simplenn(net, im_) ;

% show the classifification result scores = squeeze(gather(res(end).x)) ; 
[bestScore, best] = max(scores) ; 
fifigure(1) ; clf ; imagesc(im) ; 
title(sprintf('%s (%d), score %.3f',... net.classes.description{best}, best, bestScore)) ; 
           

bell pepper (946), score 0.704

第1章 MatConvNet簡介

圖1.1: 一個完整的例子,包括下載下傳、安裝、編譯和運作MatConvNet,并使用一個經過ImageNet預訓練的大型CNN模型對MATLAB中存儲的一張圖像進行分類。

1.2 MatConvNet一覽

MatConvNet有一個簡單的設計理念。它并沒有将CNN包裹在複雜的軟體層面上,而是直接将MATLAB指令直接展現為計算CNN構模組化塊的簡單函數,如線性卷積和ReLU運算符。這些建構塊很容易組合成完整的CNN,并可用于實作複雜的學習算法。盡管提供了幾個真實的小型和大型CNN結構和訓練例程,但仍可以利用MATLAB原型設計的高效性回到底層建構自己的結構。通常不需要C編碼來實作新的結構。是以,MatConvNet是計算機視覺和CNN研究的理想場所。

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,CIFAR10和ImageNet資料上使用随機梯度下降和CPU或GPU學習CNN的例子。
  • 預先訓練的模型。MatConvNet提供了幾種最先進的預先訓練好的CNN模型,可以用于現成的圖像分類,或者以Caffe或DeCAF的精神生成圖像編碼。
第1章 MatConvNet簡介

Figure 1.2: Training AlexNet on ImageNet ILSVRC: dropout vs batch normalisation

1.3 文檔和示例

MatConvNet有三個主要的資訊來源。首先,網站包含所有功能和幾個示例和教程的說明。11其次,有一個PDF手冊,其中包含有關工具箱的大量技術細節,包括詳細的建構塊的數學描述。第三,MatConvNet帶有幾個例子(1.1節)。

大多數例子都是完全獨立的。例如,為了運作MNIST示例,它需要将MATLAB指向MatConvNet根目錄并輸入addpath←examples,然後輸入cnn_mnist。由于問題的大小,ImageNet ILSVRC示例需要做更多準備,包括下載下傳和預處理映像(使用捆綁的腳本utils / preprocess-imagenet.sh)。還包括幾個進階示例,例如圖1.2說明了與AlexNet [8]類似的模型使用标準的dropout正則化或最新的batch normlisation(批量歸一化)技術[4]來訓練得到的top-1和top-5的驗證錯誤。結果顯示後者收斂時間為前者的大約三分之一(通過訓練資料)。MatConvNet網站還包含許多預訓練模型,即在ImageNet ILSVRC上進行過訓練的大型CNN,可以下載下傳并作為其他許多問題的起點[1]。這些包括:AlexNet [8],VGG-S,VGG-M,VGG-S [1]和VGG-VD16以及VGG-VD-19 [12]。圖1.1示例代碼展示了如何在幾行MATLAB代碼中使用一個這樣的模型。

表1.1 ImageNet 訓練速度(幀/秒)

model batch sz CPU GPU CuDNN
AlexNet 256 22.1 192.4 264.1
VGG-F 256 21.4 211.4 289.7
VGG-M 128 7.8 116.5 136.6
VGG-S 128 7.4 96.2 110.1
VGG-VD-16 24 1.7 18.4 20.0
VGG-VD-19 24 1.5 15.7 16.5

1.4 速度

效率對于使用CNN非常重要。MatConvNet支援使用NVIDIA GPU,因為它包含了所有算法的CUDA實作(或依賴于MATLAB CUDA支援)。

如果使用GPU(假設有合适的硬體可用,并且工具箱已經用GPU支援編譯),可以簡單地将參數轉換為MATLAB中的gpuArrays,如y = vl_nnconv(gpuArray(x),gpuArray(w),[]) )。以這種方式,CPU和GPU之間的切換是完全透明的。請注意,MatConvNet還可以使用NVIDIA CuDNN庫,并具有顯着的速度和空間收益。

接下來,我們将評估MatConvNet在ImageNet ILSVRC 2012挑戰資料上訓練大型結構時的性能[2]。測試機是戴爾伺服器,具有兩個頻率為3.30 GHz的Intel Xeon CPU E5-2667 v2(每個CPU具有八個核心),256 GB記憶體以及四個NVIDIA Titan Black GPU(隻有其中一個使用,除非另有說明)。實驗使用MatConvNet beta12,CuDNN v2和MATLAB R2015a。對資料進行預處理以避免在MATLAB中重新縮放圖像,并将其存儲在RAM磁盤中以便更快速地通路。該代碼使用vl_imreadjpeg指令通過多個獨立線程從磁盤讀取大批量的JPEG圖像。驅動程式examples / cnn_imagenet.m用于所有實驗。

我們對第1.3節中讨論的模型在ImageNet ILSVRC資料集上進行了訓練。表1.1報告了訓練速度即随機梯度下降法每秒處理的圖像數量。 AlexNet使用CuDNN以大約264圖像/秒的速度進行訓練,比使用CuBLAS的速度快約40%,比使用CPU快10倍以上。此外,我們注意到,盡管MATLAB開銷很大,但實作速度與Caffe相當(他們報告使用CuDNN和Titan報告253圖像/ s,這比此處使用的Titan Black稍慢)。還要注意的是,随着模型規模的不斷增大,SGD批量的大小必須減小(以适應GPU記憶體),進而增加開銷的影響。

表1.2報告了使用多個GPU的VGG-VD-16(一種非常大的模型)的速度。在這種情況下,批量大小設定為264個圖像,并進一步劃分為22個圖像的子批次以适應GPU記憶體;後者則分布在同一台機器上的1到4個GPU中。雖然存在大量的通信開銷,但訓練速度從20幀/秒增加到45幀/秒。解決這一問題是本庫的中期目标之一。

表1.2 多GPU速度(幀/秒)

num GPUs 1 2 3 4
VGG-VD-16 20.00 22.20 38.18 44.8

1.5 緻謝

MatConvNet是一個社群項目,所有貢獻者都會這樣認可。我們非常感謝NVIDIA支援這個項目,為我們提供頂級的GPU和MathWorks,以便繼續讨論如何改進該庫。這個庫中的幾個CNN計算的實作受到了Caffe庫[6]的啟發(然而,Caffe不是依賴項)。 一些示例網絡已經由Karen Simonyan作為[1]和[12]的一部分進行了訓練。

翻譯不當之處,敬請指出,及時修改,以利他人,萬分感謝!

繼續閱讀