Although the tensor was defined in the __init__ method, it won’t show in the interal parameters:
class Dan(nn.Module):
    def __init__(self):
        super(Dan, self).__init__()
        self.alpha = torch.tensor(0.5, requires_grad=True)

model = Dan()
print(list(model.parameters()))
> []

As @Mazhar_Shaikh said, you should register this tensor as an nn.Parameter:
class Dan(nn.Module):
    def __init__(self):
        super(Dan, self).__init__()
        self.alpha = nn.Parameter(torch.tensor(0.5, requires_grad=True))

model = Dan()
print(list(model.parameters()))
> [Parameter containing:
tensor(0.5000, requires_grad=True)]

which will make sure it’ll be passed to the optimizer.
The requires_grad attribute will be set to True by default for nn.Parameters, so you don’t have to set it manually.
The usage of  alpha in modrelu looks good and will yield valid gradients for it.