Hossein
Hossein

Reputation: 25964

getting axes don't match array error when trying to visualize all layers in caffe using classification.ipny

I am a newbie in python and have a very basic knowledge of the language, having said that, I'm trying to get the visualization for all layers both for weights and their filters.For this instead of repeating:

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

and changing layer name, I tried using a loop like this :

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

now it works fine for the first layer, but gives this error and stops running:

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

And this is the definition of vis_square() (defined in classification.ipny in example directory of caffe):

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

What is wrong here?
I'd be grateful if anyone could give me a hand on this.

Upvotes: 1

Views: 21796

Answers (2)

Sanaz
Sanaz

Reputation: 13

For anyone having similar problem ("axes don't match array" error): Right before transposing, I put my data in a variable giving the exact size. If my data is Data with the size of 10*12*15:

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

this worked for me.

Upvotes: 1

gunner
gunner

Reputation: 237

For subsequent layers, the number of channels is > 64. For instance, if you have num_output: 64 in the first layer and num_output: 64 in the second as well, the shape of the 4D matrix that stores the weights is 64 x 64 x height x width. After you do the transpose, it's 64 x height x width x 64.

Your function is not capable of handling a 64 layer object, though it's great for 3-layer objects.

I would just do n = int(np.ceil(np.sqrt(data.shape[0] * data.shape[3]))) and reshape the whole thing into a 1-layer object. I don't think visualising the convolution kernel as RGB will give you any insight.

Upvotes: 1

Related Questions