I am reading through the ‘Extending PyTorch’ that implements a new nn.Module and uses the function that has both forward() and backward() implemented. My question is if I want to define a new module that just adds a random weight to the input tensor and I define it like this:
class CustomLayer(nn.Module):
def __init__(self, input_dim):
super(CustomLayer, self).__init__()
self.input_dim = input_dim
self.weight = nn.Parameter(torch.Tensor(input_dim))
self.weight.data.uniform_(-0.05, 0.05)
def forward(self, input):
return torch.add(input, self.weight)
Then do I need to implement a backward() as well? Because in the forward method, I am not using a Function, but just an already implemented operation in PyTorch.
Does having an nn.Parameter() in my contructor requires me to write a backward() function? Do they get updated without havin a backward()?
To my understanding if only you implement a custom function and you want to somehow manipulate the backward operations, then you need to write a backward() function. So for example, the module in the tutorial can be simply written as:
class Linear(nn.Module):
def __init__(self, input_features, output_features, bias=True):
super(Linear, self).__init__()
self.input_features = input_features
self.output_features = output_features
self.weight = nn.Parameter(torch.Tensor(output_features, input_features))
if bias:
self.bias = nn.Parameter(torch.Tensor(output_features))
else:
self.register_parameter('bias', None)
self.weight.data.uniform_(-0.1, 0.1)
if self.bias is not None:
self.bias.data.uniform_(-0.1, 0.1)
def forward(self, input):
return torch.add(torch.matmul(input, self.weight), self.bias)
without a backward() method!