You would need to set requires_grad=True
for the weights and it would also work as nn.Conv2d
internally just calls the functional API, see here.
However, if you prefer to use the module, you could try the following code:
weights = ...
conv = nn.Conv2d(nb_channels, 1, 3, bias=False)
with torch.no_grad():
conv.weight = nn.Parameter(weights)
output = conv(x)
output.mean().backward()
print(conv.weight.grad)