5.GoogLeNet中的Filters
這里我們探索GoogLeNet中的Filters,首先你需要安裝GoogLeNet.在Matlab的APPS里找到Deep Network Designer,然后找到GoogLeNet,安裝后的網絡是沒有右下角的黃色感嘆號的,沒有安裝的神經網絡都有黃色感嘆號。
一個層(layer)的 Weights
屬性包含該層的權重。你可以使用點符號(dot notation)來訪問層的屬性:
layer.Prop
。由于 GoogLeNet 是一個預訓練網絡,它已經學習到了可以提取有用特征的權重。這里,我們將GoogLeNet 的各層被保存在變量 ly
中。并將第二層的權重保存到一個名為 W
的變量中。
% 加載網絡
net = imagePretrainedNetwork("googlenet");% 保存網絡的各層到變量ly中
ly = net.Layers;% 提取第二層
conv = ly(2);% 提取第二層的權重,這里不加分號可以看到W的輸出
W = conv.Weights
從W的輸出可以看到網絡第二層的權重(即第一個卷積層)是一個大小為 7×7×3×64 的數組。這意味著該層有 64 個不同的濾波器。每個濾波器的尺寸是 7×7×3,因此可以將它們看作是 RGB 圖像。為了正確顯示這些濾波器,必須對它們進行歸一化處理。rescale
函數可以將權重值縮放到 0 到 1 之間。使用 montage
函數可以查看這些權重組成的數組。
% 使用 montage 函數可以查看這些權重組成的數組
montage(rescale(W))
你可以通過索引訪問權重數組中的特定濾波器。你需要提取某一個濾波器的所有行、列以及 RGB 通道的數據。這里我們從權重數組中提取第 11 個濾波器,然后將其顯示出來。在使用 imshow
顯示圖像之前,應該使用 rescale
對圖像進行歸一化處理。
% 提取第11個濾波器
filter_11 = W(:,:,:,11);% 歸一化并放大顯示
figure,imshow(rescale(filter_11),"InitialMagnification", 1000)
第11個濾波器似乎在尋找粉紅色。我們加載一個圖像 roses.jpg
,這個圖片中包含一些植物,但只有玫瑰是紅色的,這意味著只有玫瑰會被第11個濾波器正向激活。
你可以通過使用 minibatchpredict
函數來測試這一點,并結合參數 Outputs
獲取卷積層的輸出:
features = minibatchpredict(net, img, Outputs="layer")
這里,我們從網絡 net
中獲取圖像 im
在層 "conv1-7x7_s2"
的激活值,并將輸出命名為 actvn
。
% 加載圖片
im = imread("roses.jpg");% 獲取圖像在第一個卷積層的輸出
actvn = minibatchpredict(net, im, Outputs="conv1-7x7_s2");
激活值的尺寸為 m×n×64。也就是說,第一層卷積中的每個濾波器都會產生一個激活圖(或稱為特征圖)。如果你想研究第11個濾波器的效果,需要提取第11個通道的激活值。對這個矩陣使用 rescale
進行歸一化,然后使用 imshow
將其顯示出來。
figure,imshow(rescale(actvn(:,:,11)))
正如預期的那樣,紅色的玫瑰被強烈激活了。你可以使用這些步驟來研究 montage
中顯示的任何一個濾波器。