Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Understanding torch.nn.Parameter

Tags:

python

pytorch

I am new to pytorch and I have difficulty in understanding how torch.nn.Parameter() works.

I have gone through the documentation in https://pytorch.org/docs/stable/nn.html but could make a very little sense out of it.

Can someone please help?

The code snippet that I am working on:

def __init__(self, weight):     super(Net, self).__init__()     # initializes the weights of the convolutional layer to be the weights of the 4 defined filters     k_height, k_width = weight.shape[2:]     # assumes there are 4 grayscale filters     self.conv = nn.Conv2d(1, 4, kernel_size=(k_height, k_width), bias=False)     self.conv.weight = torch.nn.Parameter(weight) 
like image 753
Vineet Pandey Avatar asked Jun 19 '18 19:06

Vineet Pandey


1 Answers

I will break it down for you. Tensors, as you might know, are multi dimensional matrices. Parameter, in its raw form, is a tensor i.e. a multi dimensional matrix. It sub-classes the Variable class.

The difference between a Variable and a Parameter comes in when associated with a module. When a Parameter is associated with a module as a model attribute, it gets added to the parameter list automatically and can be accessed using the 'parameters' iterator.

Initially in Torch, a Variable (which could for example be an intermediate state) would also get added as a parameter of the model upon assignment. Later on there were use cases identified where a need to cache the variables instead of having them added to the parameter list was identified.

One such case, as mentioned in the documentation is that of RNN, where in you need to save the last hidden state so you don't have to pass it again and again. The need to cache a Variable instead of having it automatically register as a parameter to the model is why we have an explicit way of registering parameters to our model i.e. nn.Parameter class.

For instance, run the following code -

import torch import torch.nn as nn from torch.optim import Adam  class NN_Network(nn.Module):     def __init__(self,in_dim,hid,out_dim):         super(NN_Network, self).__init__()         self.linear1 = nn.Linear(in_dim,hid)         self.linear2 = nn.Linear(hid,out_dim)         self.linear1.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))         self.linear1.bias = torch.nn.Parameter(torch.ones(hid))         self.linear2.weight = torch.nn.Parameter(torch.zeros(in_dim,hid))         self.linear2.bias = torch.nn.Parameter(torch.ones(hid))      def forward(self, input_array):         h = self.linear1(input_array)         y_pred = self.linear2(h)         return y_pred  in_d = 5 hidn = 2 out_d = 3 net = NN_Network(in_d, hidn, out_d) 

Now, check the parameter list associated with this model -

for param in net.parameters():     print(type(param.data), param.size())  """ Output <class 'torch.FloatTensor'> torch.Size([5, 2]) <class 'torch.FloatTensor'> torch.Size([2]) <class 'torch.FloatTensor'> torch.Size([5, 2]) <class 'torch.FloatTensor'> torch.Size([2]) """ 

Or try,

list(net.parameters()) 

This can easily be fed to your optimizer -

opt = Adam(net.parameters(), learning_rate=0.001) 

Also, note that Parameters have require_grad set by default.

like image 63
Astha Sharma Avatar answered Oct 13 '22 00:10

Astha Sharma