咱們常常會聽到「卷積神經網絡」這個名詞,那麼什麼是卷積神經網絡?它和神經網絡有什麼關係呢?網絡
====================================================ide
1.神經網絡中隱藏層、神經元數量和計算的關係大數據
以前講到了神經網絡,簡單的講就是:[ 輸入層 ⇒ 隱藏層 ⇒ 輸出層 ] 這樣的結構的計算網絡(也有一些教程裏把輸入層做爲神經網絡的第0層)3d
在以前的例子中,我用了兩個全鏈接層做爲隱藏層建立了一個用於求解計算線性迴歸問題的神經網絡(固然這個模型可以計算全部(x,y)的問題)blog
若是把輸入層改成多值,那麼這個神經網絡就能夠用於求解多輸入單輸出的問題,可是隨着輸入值的增多,隱藏層的層數或者每層的神經元數量也須要增多(這個道理相似於求解方程,一個方程只能求解一個未知數,求解多個未知數須要用到多個方程)教程
然而全鏈接層的計算量很是大,好比2層100個神經元的全鏈接,就須要100 *100次計算,3層的話就須要100 * 100 * 100 的計算,當神經網絡的層數增長、每層神經元數量增長的同時,計算量的增長也是至關驚人的。圖片
2.特定的神經網絡更善於解決特定的問題效率
如今看一下下面這張圖片,並判斷一下圖中是否有蝴蝶,同時思考一下咱們是怎麼觀察這張圖片的?神經網絡
咱們會一眼發現中間偏左的位置有一隻黑蝴蝶,而後偏右的位置有一隻白蝴蝶方法
然而,周圍的其餘植物、土壤等因素都會被咱們無心識的忽略,事實上這些因素確實和咱們的觀察目的無關
在這個過程當中,其實就是肉眼在執行「卷積操做」,只觀察與目的相關的元素,而且只會關注這一小塊區域
全是全鏈接層的神經網絡確實可以解決公共性問題,可是在特定的問題上訓練效率和識別準確度上不會很高,並且計算量會至關驚人
好比這張圖片是480 * 270的,也就是說輸入值的x有12萬之多,須要的隱藏層和神經元數量就會更多
而這張圖片上的大部份內容都與咱們的觀察目標無關,那麼咱們爲何不忽略這些因素、只關注咱們須要關注的內容呢?
因此當咱們須要識別圖片(或者其餘計算機視覺處理)的時候更多的會在神經網絡中添加捲積神經網絡層,對圖片進行卷積操做,提取必要的特徵而後進行判斷、識別
3.什麼是卷積神經網絡
那麼說了那麼多,到底什麼是卷積神經網絡呢?
其實上面已經回答了,卷積神經網絡就是加入了卷積神經網絡層的神經網絡,是加入了「卷積操做」的神經網絡
====================================================
上面以肉眼爲例子只是大概的瞭解了一下卷積操做的意義,那麼計算機是如何執行卷積操做的呢?
卷積操做就是使用同一個卷積核在原圖(的數據矩陣)上進行掃描,將每一個點以及周圍的像素值(大小同卷積核)與卷積核中相對位置的值進行乘運算操做,並將所得的和生成一張新的圖片(的數據矩陣)的過程
這裏提到了卷積操做的一些要素(下面以2D卷積操做做爲例子)
1.卷積核 kernel(過濾器 filter)
卷積核就是觀察的範圍,可是與肉眼不一樣,計算機的觀察範圍要比咱們小的多,通常咱們使用3 * 3,5 * 5,7 * 7等矩陣做爲卷積核
應該使用多大的卷積核,通常也是根據輸入圖片的大小來決定的,輸入的圖片越大,使用的卷積核也越大
(思考一下,爲何卷積核通常都是奇數?)
2.步長 strides
肉眼能夠很容易的直接找到目標內容,而計算機卻不行,計算機須要一行一行的把整張圖片掃描一遍才能找到
而掃描的間距就是步長,通常爲了避免遺漏特徵值,掃描的的步長一般都會設定成1(針對大圖時也會將步長設大)
3.填充 padding
只掃描可卷積的像素(padding=‘valid’):
若是使用3 * 3的卷積核進行卷積,那麼一般狀況下須要從(2,2)的位置開始(此處下標從1開始)
由於若是從(1,1)開始,則該點的左面和上面都沒有數據
同理最終以(n-1,n-1)結束,若是步長爲1,卷積操做之後獲得的結果會比原來的圖片長寬各少2個像素。
(思考一下,若是卷積核爲5 * 5,會減小多少個像素?)
掃描全部像素(進行邊緣0填充,padding=‘same’):
這種方式無論卷積核多大,都從(1,1)開始操做,周邊不足的地方以0進行填充,因此步長爲1的狀況下,卷積之後獲得的結果和原圖大小是同樣的
4.深度 depth
拿一個卷積覈對圖片進行一次卷積操做,將會獲得一個結果,拿多個卷積覈對圖片進行屢次卷積操做就會獲得多個結果,這個結果的數量就是深度
爲何要對同一張圖片進行屢次卷積操做呢?
首先,咱們回想一下全鏈接層中的參數是什麼?是上層神經元到本層某個神經元的權重w,兩層之間的參數w的數量就是兩層神經元個數的乘積
而卷積操做對圖片進行卷積操做的時候使用的是同一個卷積核,那麼這個卷積核就和全鏈接層中的一個w是相同的意義,一個卷積核就是一個參數(或者也能夠理解爲一個卷積核就對應一個或一組神經元),在神經網絡的訓練過程當中,每一個卷積核的值都會被調整
====================================================
如今已經瞭解了什麼是卷積操做,可是咱們通常看到的例子裏,在卷積操做事後都會跟一個池化操做
那麼什麼是池化操做呢?池化操做的目的是什麼呢?
池化操做就是使用一個特定大小的池(相似於卷積核)對圖片數據進行掃描,按照不一樣池的類型作不一樣的操做,好比經常使用的有最大池化操做和平均池化操做,就是按照池的大小從池中求最大值或者平均值,池化操做能夠有效的提取圖片數據的特徵值並進一步縮減數據量
接下來看一下池化操做的一些要素(依然以2D爲例)
1.池大小pool_size
相似於卷積操做有卷積核同樣,池化操做也有一個池大小,這個大小決定了池化操做的顆粒度,池大小越大數據量縮減的就約明顯
2.步長 strides
池化步長的概念和卷積步長的概念差很少,可是池化通常都以池大小爲步長,畢竟池化的主要目的是爲了縮減數據
3.填充 padding
當輸入的數據大小不是池大小的整數倍的時候,就須要作邊緣填充,這個填充的方法也和卷積相似