天天看點

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

作者介紹:erik reppel,coinbase公司程式員

)

在近些年,深度學習領域的卷積神經網絡(cnns或convnets)在各行各業為我們解決了大量的實際問題。但是對于大多數人來說,cnn仿佛戴上了神秘的面紗。我經常會想,要是能将神經網絡的過程分解,看一看每一個步驟是什麼樣的結果該有多好!這也就是這篇部落格存在的意義。

首先,我們要了解一下卷積神經網絡擅長什麼。cnn主要被用來找尋圖檔中的模式。這個過程主要有兩個步驟,首先要對圖檔做卷積,然後找尋模式。在神經網絡中,前幾層是用來尋找邊界和角,随着層數的增加,我們就能識别更加複雜的特征。這個性質讓cnn非常擅長識别圖檔中的物體。

cnn是一種特殊的神經網絡,它包含卷積層、池化層和激活層。

要想了解什麼是卷積神經網絡,你首先要知道卷積是怎麼工作的。想象你有一個55矩陣表示的圖檔,然後你用一個33的矩陣在圖檔中滑動。每當3*3矩陣經過的點就用原矩陣中被覆寫的矩陣和這個矩陣相乘。這樣一來,我們可以使用一個值來表示目前視窗中的所有點。下面是一個過程的動圖:

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

正如你所見的那樣,特征矩陣中的每一個項都和原圖中的一個區域相關。

在圖中像視窗一樣移動的叫做核。核一般都是方陣,對于小圖檔來說,一般選用3*3的矩陣就可以了。每次視窗移動的距離叫做步長。值得注意的是,一些圖檔在邊界會被填充零,如果直接進行卷積運算的話會導緻邊界處的資料變小(當然圖檔中間的資料更重要)。

卷積層的主要目的是濾波。當我們在圖檔上操作時,我們可以很容易得檢查出那部分的模式,這是由于我們使用了濾波,我們用權重向量乘以卷積之後的輸出。當訓練一張圖檔時,這些權重會不斷改變,而且當遇到之前見過的模式時,相應的權值會提高。來自各種濾波器的高權重的組合讓網絡預測圖像的内容的能力。 這就是為什麼在cnn架構圖中,卷積步驟由一個框而不是一個矩形表示; 第三維代表濾波器。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

注意事項:

卷積運算後的輸出無論在寬度上還是高度上都比原來的小

核和圖檔視窗之間進行的是線性的運算

濾波器中的權重是通過許多圖檔學習的

池化層和卷積層很類似,也是用一個卷積核在圖上移動。唯一的不同就是池化層中核和圖檔視窗的操作不再是線性的。

最大池化和平均池化是最常見的池化函數。最大池化選取目前核覆寫的圖檔視窗中最大的數,而平均池化則是選擇圖檔視窗的均值。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

在cnn中,激活函數和其他網絡一樣,函數将數值壓縮在一個範圍内。下面列出了一些常見的函數。

在cnn中最常用的是relu(修正線性單元)。人們有許多喜歡relu的理由,但是最重要的一點就是它非常的易于實作,如果數值是負數則輸出0,否則輸出本身。這種函數運算簡單,是以訓練網絡也非常快。

cnn中主要有三種層,分别是:卷積層、池化層和激活層。

卷積層使用卷積核和圖檔視窗相乘,并使用梯度下降法去優化卷積核。

池化層使用最大值或者均值來描述一個圖形視窗。

激活層使用一個激活函數将輸入壓縮到一個範圍中,典型的0,1。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

在我們深入了解cnn之前,讓我們先補充一些背景知識。早在上世紀90年代,yann lecun就使用cnn做了一個手寫數字識别的程式。而随着時代的發展,尤其是計算機性能和gpu的改進,研究人員有了更加豐富的想象空間。 2010年斯坦福的機器視覺實驗室釋出了imagenet項目。該項目包含1400萬帶有描述标簽的圖檔。這個幾乎已經成為了比較cnn模型的标準。目前,最好的模型在這個資料集上能達到94%的準确率。人們不斷的改善模型來提高準确率。在2014年googlenet 和vggnet成為了最好的模型,而在此之前是zfnet。cnn應用于imagenet的第一個可行例子是alexnet,在此之前,研究人員試圖使用傳統的計算機視覺技術,但alexnet的表現要比其他一切都高出15%。讓我們一起看一下lenet:

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

這個圖中并沒有顯示激活層,整個的流程是:

輸入圖檔 →卷積層 →relu → 最大池化→卷積層 →relu→ 最大池化→隐藏層 →softmax (activation)→輸出層。

下圖是一個貓的圖檔:

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

這張圖長400像素寬320像素,有三個通道(rgb)的顔色。

那麼經過一層卷積運算之後會變成什麼樣子呢?

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

這是用一個3*3的卷積核和三個濾波器處理的效果(如果我們有超過3個的濾波器,那麼我可以畫出貓的2d圖像。更高維的話就很難處理)

我們可以看到,圖中的貓非常的模糊,因為我們使用了一個随機的初始值,而且我們還沒有訓練網絡。他們都在彼此的頂端,即使每層都有細節,我們将無法看到它。但我們可以制作出與眼睛和背景相同顔色的貓的區域。如果我們将核心大小增加到10x10,會發生什麼呢?

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

我們可以看到,由于核心太大,我們失去了一些細節。還要注意,從數學角度來看,卷積核越大,圖像的形狀會變得越小。

如果我們把它壓扁一點,我們可以更好的看到色彩通道會發生什麼?

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

這張看起來好多了!現在我們可以看到我們的過濾器看到的一些事情。看起來紅色替換掉了黑色的鼻子和黑色眼睛,藍色替換掉了貓邊界的淺灰色。我們可以開始看到圖層如何捕獲照片中的一些更重要的細節。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

如果我們增加核心大小,我們得到的細節就會越來越明顯,當然圖像也比其他兩個都小。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

我們通過添加一個relu,去掉了很多不是藍色的部分。

我們添加一個池化層(擺脫激活層最大限度地讓圖檔更加更容易顯示)。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

正如預期的那樣,貓咪變成了斑駁的,而我們可以讓它更加斑駁。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

現在圖檔大約成了原來的三分之一。

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

如果我們将貓咪的圖檔放到lenet模型中做卷積和池化,那麼效果會怎麼樣呢?

卷積神經網絡實戰(可視化部分)——使用keras識别貓咪CNN是什麼激活層CNN是什麼樣的呢?讓我們一起看一個實際的例子增加一個激活層增加一個池化層激活和最大池化LeNet總結

convnets功能強大,因為它們能夠提取圖像的核心特征,并使用這些特征來識别包含其中的特征的圖像。即使我們的兩層cnn,我們也可以開始看到網絡正在對貓的晶須,鼻子和眼睛這樣的地區給予很多的關注。這些是讓cnn将貓與鳥區分開的特征的類型。

cnn是非常強大的,雖然這些可視化并不完美,但我希望他們能夠幫助像我這樣正在嘗試更好地了解convnets的人。

擴充閱讀

<a href="http://cs231n.github.io/convolutional-networks/">andrej karpathy’s cs231n!</a>

<a href="https://arxiv.org/pdf/1603.07285v1.pdf">a guide to convolution arithmetic for deep learning by vincent dumoulin and francesco visin</a>

以上為譯文

文章原标題《visualizing parts of convolutional neural networks using keras and cats》,作者:erik reppel,譯者:愛小乖,審校:6816816151。

繼續閱讀