2017-06-14 31 views
1

我一直在尋找一種方式來顯示網絡後Caffe中的參數,我發現this link。它發送參數轉置如何可視化Caffe參數?

filters = net.params['conv1'][0].data 
vis_square(filters.transpose(0, 2, 3, 1)) 

我不明白爲什麼它轉置數據?而在vis_square它使用此代碼:

data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1))) 
data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:]) 

這也太壓縮明白,任何解釋,將不勝感激。然後當我改變了代碼來獲得,而不是CONV2的CONV1:

filters = net.params['conv2'][0].data 
vis_square(filters.transpose(0, 2, 3, 1)) 

我得到

TypeError: Invalid dimensions for image data

,有CONV1和CONV2之間有什麼不同造成這個錯誤?我們如何改變代碼來修復它,它適用於所有層?

一些調試數據:

net.params['conv1'][0].data.shape : (96, 3, 11, 11) 
net.params['conv1'][1].data.shape : (96,) 
net.params['conv2'][0].data.shape : (256, 48, 5, 5) 
net.params['conv2'][1].data.shape : (256,) 
net.params['conv3'][0].data.shape : (384, 256, 3, 3) 
net.params['conv3'][1].data.shape : (384,) 

for conv2: 
data.shape[0] : 256 
np.sqrt(data.shape[0]) : 16.0 
np.ceil(np.sqrt(data.shape[0])) : 16.0 

data.shape[0] : 256 
data.shape[0:] : (256, 6, 6, 48) 
data.shape[1] : 6 
data.shape[1:] : (6, 6, 48) 
data.ndim : 4 
range(4, data.ndim + 1)) : [4] 
tuple(range(4, data.ndim + 1)) : (4,) 

後:

data = np.pad(data, padding, mode='constant', constant_values=1) 

爲CONV 2:

data.shape : (10, 12, 10, 12, 3) 

data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1))) 

數據成爲:

data.shape : (120, 120, 3) 

回答

1

你檢查的代碼被寫入以顯現(即,轉換爲RGB圖像)的卷積濾波器。
conv1濾波器形狀(在你的例子)是(96, 3, 11, 11)這意味着
- 96:你有96個過濾器在您的淨的conv1(即,num_output: 96),因此你會希望查看96個不同的濾波器。
- 3:每個濾鏡的輸入尺寸爲3,因爲網絡中conv1的輸入是帶有三個通道的RGB圖像。
- 11, 11:您的情況下每個內核/過濾器的空間大小爲11x11(即,kernel_size: 11)。
因此,要將96個篩選器可視化爲11x11x3縮略圖。

但是,當試圖可視化conv2(或任何其他更深層)時,您遇到問題。不再有RGB含義來過濾尺寸。 conv2的過濾器適用於conv1(在您的情況下是96-dim空間)的輸出功能。迄今爲止,AFAIK沒有直接的方式將96-dim數據轉換爲簡單的3D RGB表示。
因此,您不能使用相同的代碼來可視化conv2過濾器。您必須使用其他方法進行可視化。