2017-06-14 53 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过滤器。您必须使用其他方法进行可视化。