saurabhvyas:

loss = criterion(Variable(final_output, requires_grad=True), label)


You cant rewrap your Variables like this, it loses history.
You need to do all operations on a Variable.
x = torch.Tensor(...)
y = x * 2
y = Variable(y,requires_grad=True)
# In the above example, y does not know that x created it.

# Correct usage below:
x = Variable(torch.Tensor(...), requires_grad=True)
y = x * 2