【深度學習】權值共享問題


要理解卷積,首先你要理解什么是全連接和局部連接,全連接是什么?舉個例子,100*100大小的圖像,假設有100個隱含神經元,那么就有100*100*100個連接,

太可怕,局部連接是什么,假設每個隱含神經元只局部連接10*10,那么就有10*10*100個連接。

那么什么是卷積,什么又是權值共享?

說道權值共享,就需要提到感受野,感受野其實就是一個隱含神經元的局部連接大小,權值共享就是感受野的權值一樣,也就是說,假設這層的感受野是2*2,這層隱含神經元就會有100*(2*2+1)的連接,這里代表偏置。

卷積呢?這里的卷積和信號里面的卷積還是有一定區別的,這里的目的是,用小樣本來學習大樣本的特征,假如小樣本是8*8,那么每個神經元就可以得到(100-8+1)*(100-8+1)個特征,這一層就一共有100*93*93個卷積特征。

什么是池化呢?

上面卷積不是獲得了特征嗎?可是還是有很多的維數啊,100*93*93維的卷積特征,太龐大了,為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。

也就是說,池化就是特征的聚合統計,依據於圖像的靜態性屬性。

做完以上工作,再進行全連接層的建立,訓練,並加上分類器,分類器可有有很多,KNN,softmax,SVM等等,再進行常規的訓練,也可以用wake-sleep的訓練。

 

h_relu = self.input_linear(x).clamp(min=0)

    for _ in range(random.randint(0, 3)):

      h_relu = self.middle_linear(h_relu).clamp(min=0)

    y_pred = self.output_linear(h_relu)

    return y_pred

 

 

CNN中權值共享理解

 

第一步,針對一個神經元,一幅640*360圖像,一個神經元要對應640*360個像素點,即一個神經元對應全局圖像,全連接的話一個神經元就有640*360個參數;

第二步,然而,圖像的空間聯系是局部的,就像人是通過一個局部的感受野去感受外界圖像一樣,每一個神經元都不需要對全局圖像做感受,每個神經元只感受局部的圖像區域,然后在更高層,將這些不同局部的神經元綜合起來就可以得到全局信息。假如每個局部感受野10*10,每個局部感受野只需要和10*10的局部圖像連接,這樣一個神經元就只需要10*10個參數;

第三步,全局圖像是640*360,但局部圖像只有10*10大小,10*10個參數只針對局部圖像,如果全局圖像中各個局部圖像之間權值共享的話,即10*10個參數在不同局部圖像上參數應用相同的話,則在全局圖像上通過全局共享則只需要10*10個參數;

第四步,10*10個參數只針對一個神經元,要是有100萬個神經元,則需要100萬*10*10個參數,神經元多后,參數還是太大,如果每個神經元的這10*10個參數相同呢,這樣就還是只需要10*10參數,因而經過局部感受野到權值共享再到每個神經元的10*10個參數相同,不管圖像多大,不管每層神經元個數多少,而兩層間連接還是只需要求解10*10個參數;

第五步,由於只有一個濾波器,只提取了一種特征,特征也太少了。一種濾波器也就是一種卷積核就是提取圖像一種特征,例如某個方向的邊緣。那么我們需要提取不同特征怎么辦,多加幾個濾波器不就行了。假設我們加到100種濾波器,每種濾波器的參數不一樣,表示提取輸入圖像不同特征,例如不同邊緣。這樣不同濾波器去卷積圖像就得到不同特征的放映,我們稱之為Feature Map,所以100中卷積核就有100個Feature Map,這100個Feature Map就組成了一層神經元。我們這一層有多少個參數到這時候就明了吧,100種卷積核  *   每種卷積核100個參數  = 100 * 100 = 10000個參數。

最后,剛才說每一個隱藏層的參數個數和隱藏層的神經元個數無關,只和濾波器大小和濾波器種類數有關,那么隱藏層的神經元個數怎么確定呢?它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關!假如我的圖像是1000*1000像素的,而濾波器大小是10*10,假設步長為10,即濾波器沒有重疊,這樣隱藏層的神經元個數就是 1000 * 1000 / (10*10) = 100*100個神經元(如果步長為8,卷積核會重疊2個像素)。這只是一種濾波器,也就是一個Feature Map的神經元個數哦,如果100個Feature Map就是100倍了,

        需要注意一點,上面的討論都沒有考慮每個神經元的偏置部分,所以權值個數需要加1,這也是同一種濾波器共享。如濾波器10*10,卷積核個數6,則參數個數為:

(10*10 +1) * 6 = 606.

 

 

要理解卷積,首先你要理解什么是全連接和局部連接,全連接是什么?舉個例子,100*100大小的圖像,假設有100個隱含神經元,那么就有100*100*100個連接,

 

太可怕,局部連接是什么,假設每個隱含神經元只局部連接10*10,那么就有10*10*100個連接。

 

那么什么是卷積,什么又是權值共享?

 

說道權值共享,就需要提到感受野,感受野其實就是一個隱含神經元的局部連接大小,權值共享就是感受野的權值一樣,也就是說,假設這層的感受野是2*2,這層隱含神經元就會有100*(2*2+1)的連接,這里代表偏置。

 

卷積呢?這里的卷積和信號里面的卷積還是有一定區別的,這里的目的是,用小樣本來學習大樣本的特征,假如小樣本是8*8,那么每個神經元就可以得到(100-8+1)*(100-8+1)個特征,這一層就一共有100*93*93個卷積特征。

 

什么是池化呢?

 

上面卷積不是獲得了特征嗎?可是還是有很多的維數啊,100*93*93維的卷積特征,太龐大了,為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。

 

也就是說,池化就是特征的聚合統計,依據於圖像的靜態性屬性。

 

做完以上工作,再進行全連接層的建立,訓練,並加上分類器,分類器可有有很多,KNN,softmax,SVM等等,再進行常規的訓練,也可以用wake-sleep的訓練。

 

 

 

h_relu = self.input_linear(x).clamp(min=0)

 

    for _ in range(random.randint(0, 3)):

 

      h_relu = self.middle_linear(h_relu).clamp(min=0)

 

    y_pred = self.output_linear(h_relu)

 

    return y_pred

 

 

 

 

 

CNN中權值共享理解

 

 

 

第一步,針對一個神經元,一幅640*360圖像,一個神經元要對應640*360個像素點,即一個神經元對應全局圖像,全連接的話一個神經元就有640*360個參數;

 

第二步,然而,圖像的空間聯系是局部的,就像人是通過一個局部的感受野去感受外界圖像一樣,每一個神經元都不需要對全局圖像做感受,每個神經元只感受局部的圖像區域,然后在更高層,將這些不同局部的神經元綜合起來就可以得到全局信息。假如每個局部感受野10*10,每個局部感受野只需要和10*10的局部圖像連接,這樣一個神經元就只需要10*10個參數;

 

第三步,全局圖像是640*360,但局部圖像只有10*10大小,10*10個參數只針對局部圖像,如果全局圖像中各個局部圖像之間權值共享的話,即10*10個參數在不同局部圖像上參數應用相同的話,則在全局圖像上通過全局共享則只需要10*10個參數;

 

第四步,10*10個參數只針對一個神經元,要是有100萬個神經元,則需要100萬*10*10個參數,神經元多后,參數還是太大,如果每個神經元的這10*10個參數相同呢,這樣就還是只需要10*10參數,因而經過局部感受野到權值共享再到每個神經元的10*10個參數相同,不管圖像多大,不管每層神經元個數多少,而兩層間連接還是只需要求解10*10個參數;

 

第五步,由於只有一個濾波器,只提取了一種特征,特征也太少了。一種濾波器也就是一種卷積核就是提取圖像一種特征,例如某個方向的邊緣。那么我們需要提取不同特征怎么辦,多加幾個濾波器不就行了。假設我們加到100種濾波器,每種濾波器的參數不一樣,表示提取輸入圖像不同特征,例如不同邊緣。這樣不同濾波器去卷積圖像就得到不同特征的放映,我們稱之為Feature Map,所以100中卷積核就有100個Feature Map,這100個Feature Map就組成了一層神經元。我們這一層有多少個參數到這時候就明了吧,100種卷積核  *   每種卷積核100個參數  = 100 * 100 = 10000個參數。

 

最后,剛才說每一個隱藏層的參數個數和隱藏層的神經元個數無關,只和濾波器大小和濾波器種類數有關,那么隱藏層的神經元個數怎么確定呢?它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關!假如我的圖像是1000*1000像素的,而濾波器大小是10*10,假設步長為10,即濾波器沒有重疊,這樣隱藏層的神經元個數就是 1000 * 1000 / (10*10) = 100*100個神經元(如果步長為8,卷積核會重疊2個像素)。這只是一種濾波器,也就是一個Feature Map的神經元個數哦,如果100個Feature Map就是100倍了,

 

        需要注意一點,上面的討論都沒有考慮每個神經元的偏置部分,所以權值個數需要加1,這也是同一種濾波器共享。如濾波器10*10,卷積核個數6,則參數個數為:

 

(10*10 +1) * 6 = 606.

 

 

 

 

 

 

 

輸入層:對於一幅1000x1000大小的圖像(假設為灰度圖,不考慮3通道),我們把這個圖像作為神經網絡的輸入層,那么輸入層的神經元的個數就是每個像素點,個數為1000x1000個。

 

隱層:我們再規定和這個輸入層連接的隱層的神經元個數為1000,000個。

 

輸入層和隱層之間肯定是通過權值(重)W連接起來的,即X*W=Y(W為權值,X為輸入,Y為隱層),如果不是權值共享,而是最基本的全連接,那么W的維數就是1000x1000x1000,000,這樣的話,W有點太多了。於是想法減少W的維數。

 

方法:讓隱層的1000,000個神經元里的每個神經元“只”和輸入層的10x10個神經元進行連接,而不是和輸入層的1000x1000個神經元進行連接。這就是感受野。

 

上面提到的方法還不是權值共享,因為還有提升,如下:

 

權值共享:在上述方法中我們得到的輸入層和隱層之間連接的W的維度變成了:1000,000 x 10 x 10,假定這些W中的每個元素都是不同的,那么我們需要把所有的W元素都保存下來以備之后使用,但是如果這些W全都是10 x 10個權重的復制呢?也就是說隱層的每個神經元跟圖像上不同區域的10 x 10個神經元的連接都是相同的,那么我們最后得到的W只有10x10大小了,只需要保存100個參數就可以了。當然,這樣做也太粗糙了,肯定提取的特征太少,沒關系啊,我們多加幾個10 x 10大小的W不就可以了,比如100個,那 就可以提取100次特征了,而總的W的維度(輸入與隱藏的連接個數)就變成了100 x 10x10=10,000個。

 

這就是權值共享的全部。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM