CasellaJr
CasellaJr

Reputation: 458

Printing only the first weights of a neural network

I have my model (a VGG16, but it is not important). I want to check only some parameters of my network, for example the first ones. To do this I do list(model.parameters()) and it prints all the parameters. Now, considering that a VGG has this shape:

VGG16(
  (block_1): Sequential(
    (0): Conv2d(1, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (2): ReLU()
    (3): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (4): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
    (5): ReLU()
    (6): MaxPool2d(kernel_size=(2, 2), stride=(2, 2), padding=0, dilation=1, ceil_mode=False)
  )
...

If I want only the weights of the convolutions I do this: list(model.block_1[0].parameters()) and it prints this:

[Parameter containing:
 tensor([[[[-0.3215, -0.0771,  0.4429],
           [-0.6455, -0.0827, -0.4266],
           [-0.2029, -0.2288,  0.1696]]],
 
 
         [[[ 0.5323, -0.2418, -0.1031],
           [ 0.5917,  0.2669, -0.5630],
           [ 0.3064, -0.4984, -0.1288]]],
 
 
         [[[ 0.3804,  0.0906, -0.2116],
           [ 0.2659, -0.3325, -0.1873],
           [-0.5044,  0.0900,  0.1386]]],
 

Now, these lists are always enormous. How can I print only the first values, for example, the first matrix?

[[[[-0.3215, -0.0771,  0.4429],
   [-0.6455, -0.0827, -0.4266],
   [-0.2029, -0.2288,  0.1696]]]

Upvotes: 0

Views: 304

Answers (2)

CuCaRot
CuCaRot

Reputation: 1308

You can treat it as a NumPy array when it's processed correctly. In your example, this should work:

from torchvision import models
model = models.vgg16()
first_param = list(model.features[0].parameters())[0].data

The first_param will hold the tensor as:

tensor([[[[-0.3215, -0.0771,  0.4429],
           [-0.6455, -0.0827, -0.4266],
           [-0.2029, -0.2288,  0.1696]]],
 
 
         [[[ 0.5323, -0.2418, -0.1031],
           [ 0.5917,  0.2669, -0.5630],
           [ 0.3064, -0.4984, -0.1288]]],
 
 
         [[[ 0.3804,  0.0906, -0.2116],
           [ 0.2659, -0.3325, -0.1873],
           [-0.5044,  0.0900,  0.1386]]]

Then just continue as NumPy array:

print(first_param[0])

>> tensor([[[[-0.3215, -0.0771,  0.4429],
             [-0.6455, -0.0827, -0.4266],
             [-0.2029, -0.2288,  0.1696]]])

Upvotes: 2

Schnitte
Schnitte

Reputation: 1217

You can slice Tensorflow tensors with the same syntax as Python lists. For example:

import tensorflow as tf

tensor = tf.constant([[[[-0.3215, -0.0771,  0.4429],
       [-0.6455, -0.0827, -0.4266],
       [-0.2029, -0.2288,  0.1696]]],

     [[[ 0.5323, -0.2418, -0.1031],
       [ 0.5917,  0.2669, -0.5630],
       [ 0.3064, -0.4984, -0.1288]]],

     [[[ 0.3804,  0.0906, -0.2116],
       [ 0.2659, -0.3325, -0.1873],
       [-0.5044,  0.0900,  0.1386]]]])

print(tensor[0, :])

This will give you the first matrix from your example, together with related shape information. If you want to get rid of this shape information, you could, for instance, convert the sliced tensor into a numpy array with print(np.array(tensor[0, :])).

Upvotes: 0

Related Questions