Hi,
I am using following code to generate hessian. I have used L2 regularised categorical cross entropy as a loss function. So hessian should be symmetric. But i am getting symmetric.
import torch
torch.set_default_dtype(torch.float64)
import torchvision
import torchvision.models as models
from torchvision import transforms
import torch.utils.data
import torch.nn as nn
import numpy as np
device = torch.device(‘cuda’ if torch.cuda.is_available() else ‘cpu’)
#defining data tranform
transform = transforms.Compose([transforms.ToTensor(), transforms.Lambda(lambda x: x.repeat(3, 1, 1) ), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
download trainset and testset
trainset = torchvision.datasets.MNIST(root=‘data’, train=True, download=True, transform=transform)
train_loader=torch.utils.data.DataLoader(trainset, batch_size=512, shuffle=True, num_workers=2)
testset = torchvision.datasets.MNIST(root=‘data’, train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=128, shuffle=True, num_workers=2)
#defining model
cnn = models.resnet18(pretrained=False)
classifier = nn.Linear(in_features=512, out_features=10, bias=True)
cnn.fc=classifier
cnn=cnn.to(device)
##loss function
loss_fn = nn.CrossEntropyLoss()
##flattering parameters
p= torch.cat([gi.data.view(-1) for gi in cnn.parameters()])
calculating hessian
for batch, (X, y) in enumerate(train_loader):
cnn.train()
###creating hessian matrix with zeros
H=torch.zeros(len(p), len(p)).to(device)
X = X.to(device)
y = y.to(device)
pred=cnn(X)
loss=loss_fn(pred, y)
l2_norm = sum(p.pow(2.0).sum() for p in cnn.parameters())
loss = loss + l2_lambda * l2_norm
env_grads = torch.autograd.grad(loss, cnn.parameters(), retain_graph=True, create_graph=True)
g= torch.cat([gi.reshape(-1) for gi in env_grads])
for i in range(len(p)):
h_col=torch.autograd.grad(g[column_indx[i]], cnn.parameters(), retain_graph=True, create_graph=False)
H[i]= torch.cat([gi.reshape(-1) for gi in h_col])
After creating H, i checked whether it is symmetric or not… But not getting symmetric. Please suggest where is the problem.
At first i used “torch.set_default_dtype(torch.float64)” but still not able to solve.
I will not be able to use PyTorch inbuilt hessian function to calculate hessian as I need only some part of hessian without calculation of whole hessian matrix.