在尝试使用classification.ipny可视化caffe中的所有图层时,获取轴与数组错误不匹配

时间:2016-05-07 15:01:36

标签: python-2.7 caffe

我是python中的新手,并且对该语言有非常基本的了解,我说过,我正在尝试为权重及其过滤器获取所有图层的可视化。为此而不是重复:

# the parameters are a list of [weights, biases]
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0, 2, 3, 1))

并更改图层名称,我尝试使用这样的循环:

 for layer_name, param in net.params.iteritems():
    # the parameters are a list of [weights, biases]
    filters = net.params[layer_name][0].data
    vis_square(filters.transpose(0, 2, 3, 1))

现在它适用于第一层,但是会出现此错误并停止运行:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-16-cf7d5999a45c> in <module>()
      2     # the parameters are a list of [weights, biases]
      3     filters = net.params[layer_name][0].data
----> 4     vis_square(filters.transpose(0, 2, 3, 1))

ValueError: axes don't match array

这是vis_square()的定义(在caffe的示例目录中的classification.ipny中定义):

def vis_square(data):
    """Take an array of shape (n, height, width) or (n, height, width, 3)
       and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)"""

    # normalize data for display
    data = (data - data.min()) / (data.max() - data.min())

    # force the number of filters to be square
    n = int(np.ceil(np.sqrt(data.shape[0])))
    padding = (((0, n ** 2 - data.shape[0]),
               (0, 1), (0, 1))                 # add some space between filters
               + ((0, 0),) * (data.ndim - 3))  # don't pad the last dimension (if there is one)
    data = np.pad(data, padding, mode='constant', constant_values=1)  # pad with ones (white)

    # tile the filters into an image
    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:])

    plt.imshow(data); plt.axis('off')

这里有什么问题?
如果有人能帮我解决这个问题,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于后续层,通道数> 64.例如,如果第一层中有num_output: 64,第二层中有num_output: 64,则存储权重的4D矩阵的形状为64 x 64 x height x width。进行转置后,它是64 x height x width x 64

您的功能无法处理64层对象,但它对3层对象非常有用。

我会做n = int(np.ceil(np.sqrt(data.shape[0] * data.shape[3])))并将整个事物重塑为1层对象。我不认为将卷积内核可视化,因为RGB将为您提供任何见解。

答案 1 :(得分:0)

对于任何有类似问题的人(“轴与数组不匹配”错误):在转置之前,我将数据放入一个给出确切大小的变量中。如果我的数据是10 * 12 * 15的数据:

DataI = Data [0:9, 0:11, 0:14]
DataII = np.transpose(DataI,(0,2,1))

这对我有用。