如何可视化Caffe参数?

时间:2017-06-14 15:25:54

标签: python numpy matplotlib deep-learning caffe

我一直在寻找一种在培训网络后可视化Caffe参数的方法,我发现this link。它用

发送参数的转置
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:])

我不明白为什么要转置数据?并在 vis_square 中使用此代码:

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

哪个太压缩无法理解,任何解释都会受到赞赏。然后当我改变代码以获得conv2而不是conv1时:

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,)

我得到了

  

TypeError:图片数据的尺寸无效

,conv1和conv2之间是否有任何不同导致此错误?我们如何更改代码来修复它并且它适用于所有层?

一些调试数据:

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

和之后:

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

for conv2:

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

之后

data.shape :  (120, 120, 3)

数据变成了:

var child_options = {
      cwd : prj
    , env : {
                PATH: cmd_directory
            }
    , detatched : true
    , stdio     : 'ignore'
};

//Spawn a child process with child options and command line params
child = spawn('mycommand', arg_array, child_options, function(err, stdout, stderr){

    if (err) {
        console.log("\t\tProblem executing aerender =>\n\t\t" + err);
    } else {
        console.log("\t\tLaunched aerender successfully!")
    }

});

child.unfref() //To ensure child runs as its own process (async style)

1 个答案:

答案 0 :(得分:1)

您检查的代码被编写为可视化(即转换为RGB图像)卷积滤波器 conv1过滤器(在您的示例中)的形状为(96, 3, 11, 11),表示为 - 96:您的网络conv1中有96个过滤器(即num_output: 96),因此您希望查看96个不同的过滤器。
- 3:每个过滤器的输入维度为3,因为网络中conv1的输入是带有三个通道的RGB图像。
- 11, 11:您案例中每个内核/过滤器的空间大小为11x11(即kernel_size: 11)。 因此,将96个过滤器可视化为11x11x3缩略图。

但是,在尝试可视化conv2(或任何其他更深层)时,您遇到了问题。过滤尺寸不再具有RGB含义。 conv2的过滤器适用于conv1的输出要素(在您的情况下是96维度空间)。迄今为止,AFAIK没有直接的方法将96-dim数据转换为简单的3D RGB表示。
因此,您无法使用相同的代码来显示conv2过滤器。您必须使用其他方法进行可视化。