2017-04-09 93 views
2

我已經Conv2D層定義爲:
如何在keras中正確地從Conv2D獲取圖層權重?

Conv2D(96, kernel_size=(5, 5), 
      activation='relu', 
      input_shape=(image_rows, image_cols, 1), 
      kernel_initializer=initializers.glorot_normal(seed), 
      bias_initializer=initializers.glorot_uniform(seed), 
      padding='same', 
      name='conv_1') 

這是我的網絡中的第一層。
輸入尺寸64乘160,圖片爲1個通道。
我想從這個卷積圖層中看到權重,但不知道如何獲得它們。
這裏是我現在如何這樣做:

1.Call

layer.get_weights()[0] 

這returs形狀的陣列(5,5,1,96)。 1是因爲圖像是1通道。

2.Take 5×5個濾波器由

layer.get_weights()[0][:,:,:,j][:,:,0] 

非常難看,但我不知道如何簡化這一點,任何意見都非常讚賞。

我不確定這些5乘5格。他們真的過濾嗎?
如果沒有人可以請告訴如何正確地從模型中抓取過濾器?

回答

4

我試圖顯示重量像這樣只有前25個。我有同樣的問題,你做的是這個過濾器或其他東西。它似乎不是從深層信仰網絡或堆疊RBM中獲得的相同過濾器。

這裏是未經訓練的可視化權重:untrained weights

和這裏的訓練的權重:

trained weights

奇怪的是有訓練後沒有任何變化!如果你比較它們,它們是相同的。

,然後DBN RBM在頂部,2層的底部過濾層1: DBM RBM filters

如果我設置kernel_intialization =「一」然後我得到的過濾器,看起來不錯,但淨虧損從未有許多降低雖然試驗和誤差的變化:

下面是顯示2D轉化率重量/過濾器的代碼。

ann = Sequential() 
    x = Conv2D(filters=64,kernel_size=(5,5),input_shape=(32,32,3)) 
    ann.add(x) 
    ann.add(Activation("relu")) 

...

x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

    ann.fit(Xtrain, ytrain_indicator, epochs=5, batch_size=32) 

    x1w = x.get_weights()[0][:,:,0,:] 
    for i in range(1,26): 
     plt.subplot(5,5,i) 
     plt.imshow(x1w[:,:,i],interpolation="nearest",cmap="gray") 
    plt.show() 

--------------------------- UPDATE ----- -------------------

所以我再次嘗試用0.01而不是1e-6的學習率,並使用0和1之間的規範化圖像,而不是通過將圖像除以255.0來得到0和255。現在,卷積過濾器正在發生變化,第一卷積濾波器的輸出看起來就像這樣: Untrained Weights

訓練有素的過濾器,你會發現與合理的學習速度改變(不是很多):Trained Convolution Filter

這裏是CIFAR-10測試儀的圖像七:Image 7 CIFAR-10 Car

,這裏是第一卷積層的輸出: Convolution Layer Output

如果我把最後一圈Laye的r(無中間密集層)並將其饋送給未經訓練的分類器,它與根據精度對原始圖像進行分類相似,但如果我訓練卷積層,則最後的卷積層輸出會提高分類器(隨機森林)的準確性。

所以我會得出結論卷積層確實是過濾器以及權重。

+0

感謝您的回答!這是一個非常奇怪的事情:在隨機初始化的情況下權重是相似的。我正在使用爲conv層推薦的glorot初始化。對我來說最困惑的問題是:我們正在訓練網絡,但體重相同。我們訓練了什麼?對此沒有回答... –

+0

那麼權重的第三維是什麼?在'x1w = x.get_weights()[0] [:,:,0,:]'中,'[:,:,0,:]'中的0。我認爲前兩個變暗是內核x和y,最後一個是內核的數量 - 但我不知道第三維是什麼。它似乎是前一層輸出的維度,但我不明白爲什麼或者什麼是真正意義。 – wordsforthewise

+0

0是紅色通道。三個維度是紅色綠色和藍色。第一個是x第二個是y第三個是通道,最後是第n個卷積層。 – John