custom_loss_grad_hess=partial(torch_autodiff_grad_hess,custom_loss)# create model instancefromfunctoolsimportpartial# custom_loss = torch.nn.MSELoss(reduction="sum") # sum is required; mean does not workdefcustom_loss(y_pred,y_true):return(((y_pred-y_true)/y_true)**2.sum()# sum is required; mean does not work)deftorch_autodiff_grad_hess(loss,y_true:np.ndarray,y_pred:np.ndarray):"""Perform automatic differentiation to get the Gradient and the Hessian of `loss_function`. """y_true=torch.from_numpy(y_true)y_pred=torch.from_numpy(y_pred)y_pred.requires_grad_()loss_lambda=lambday_pred:loss(y_pred,y_true)grad=torch.autograd.functional.jacobian(loss_lambda,y_pred,vectorize=True,)hess_matrix=torch.autograd.functional.hessian(loss_lambda,y_pred,vectorize=True,)hess=torch.diagonal(hess_matrix)returngrad.numpy(),hess.numpy()