When writing a custom function with custom forward and backward:

Assume the module

```
class IMyFunction(torch.autograd.Function):
@staticmethod
def forward(ctx, x, a, b):
# a is a learnable parameter. b is a constant tensor
# b.requires_grad is False
ctx.save_for_backward(x, a, b)
# Compute y ...
return y
@staticmethod
def backward(ctx, grad_y):
x, a, b = ctx.saved_tensors
# Compute gradient of x and learnable parameter a
return d_x, d_a
```

where `a`

is a trainable parameter and `b`

a constant tensor.

Using this module results in the error message:

Traceback (most recent call last):

File “./test.py”, line 217, in test_both

y.backward(y_grad)

File “/home/matthias/.local/lib/python3.7/site-packages/torch/tensor.py”, line 166, in backward

torch.autograd.backward(self, gradient, retain_graph, create_graph)

File “/home/matthias/.local/lib/python3.7/site-packages/torch/autograd/init.py”, line 103, in backward

allow_unreachable=True) # allow_unreachable flag

RuntimeError: function MyFunctionBackward returned an incorrect number of gradients (expected 3, got 2)

My question: Why are backward functions required to return a gradient for non learnable parameters?

How to mark a inputs as constant? (No gradient is computed)

Or Is this there a bug in

https://github.com/pytorch/pytorch/blob/master/torch/csrc/autograd/custom_function.h ?