Hello everyone,
I’m trying to build a custom module layer which itself uses a custom function. Then, inside this function it would be nice, if I could use existing functions. As a simplified example I wrapped a Linear Layer inside my function and try to pass its weights as a parameter from the “surrounding” module. However, when I first try to execute the code like quoted below I ran into my first problem: When passing a Variable to the Module LinLayer, the datatypes are as expected: (Variable & Parameter), BUT when I check the types inside the function, they changed to Tensors. Why is that? This results in the error “TypeError: cannot assign ‘torch.FloatTensor’ as parameter ‘weight’ (torch.nn.Parameter or None expected)
”
import torch
class linFct(torch.autograd.Function):
def forward(self, fctDataIn, fctWeight):
self.save_for_backward(fctDataIn, fctWeight)
print("function")
print("data: ", type(fctDataIn))
print("weight: ", type(fctWeight))
tmpLin = torch.nn.Linear(3, 2, bias=False)
tmpLin.weight = fctWeight
return tmpLin(fctDataIn)
def backward(self, grad_output):
fctDataIn, fctWeight = self.saved_tensors
tmpLin = torch.nn.Linear(3, 2, bias=False)
tmpLin.weight = fctWeight
tmpLin.zero_grad()
tmpLin(fctDataIn).backward(grad_output)
grad_fctDataIn = fctDataIn.grad.data
grad_fctWeight = fctWeight.grad.data
return grad_fctDataIn, grad_fctWeight
class linLayer(torch.nn.Module):
def __init__(self):
super(linLayer, self).__init__()
self.wParam = torch.nn.Parameter(torch.randn(2, 3))
self.fct = linFct()
def forward(self, layerIn):
print("layer")
print("data: ", type(layerIn))
print("weight: ", type(self.wParam))
return self.fct(layerIn, self.wParam)
x = torch.autograd.Variable(torch.randn(2, 3), requires_grad=True)
fct = linLayer()
print("forward...")
y = fct(x)