Hi All,
I was wondering if it’s at all possible to compute the Hessian of an nn.Module
of the output w.r.t its input for a batch of inputs? I understand this is a limitation of torch.autograd.functional.hessian
but is there a way to add batch support to such a function? Like I’ve shown below with the jacobian
function?
Any help would be apprecitated!
Thank you!
import torch
def func(xs):
return xs.pow(2).sum(dim=-1)
def jacobian(net, xs):
ys = net(xs)
return torch.autograd.grad(ys, xs, torch.ones_like(ys))[0]
def hessian(net, xs):
return torch.autograd.functional.hessian(net, xs)
xs = torch.randn(1, requires_grad=True) #single example (i.e. no batch)
jacobian(func, xs) #returns tensor([0.6949])
hessian(func, xs) #returns tensor([[2.]])
xs = torch.randn(2, 1, requires_grad=True) #batch dim included
jacobian(func, xs)
"""
returns
tensor([[-2.7621],
[ 0.1642]])
"""
hessian(func, xs) #throws error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in hessian
File "~/anaconda3/lib/python3.8/site-packages/torch/autograd/functional.py", line 701, in hessian
res = jacobian(jac_func, inputs, create_graph=create_graph, strict=strict, vectorize=vectorize)
File "~/anaconda3/lib/python3.8/site-packages/torch/autograd/functional.py", line 482, in jacobian
outputs = func(*inputs)
File "~/anaconda3/lib/python3.8/site-packages/torch/autograd/functional.py", line 697, in jac_func
jac = jacobian(ensure_single_output_function, inp, create_graph=True)
File "~/anaconda3/lib/python3.8/site-packages/torch/autograd/functional.py", line 482, in jacobian
outputs = func(*inputs)
File "~/anaconda3/lib/python3.8/site-packages/torch/autograd/functional.py", line 692, in ensure_single_output_function
raise RuntimeError("The Tensor returned by the function given to hessian should contain a single element")
RuntimeError: The Tensor returned by the function given to hessian should contain a single element