Your output also shows, that fc3.bias and fc4.bias have valid gradients.
As long as you pass these parameters to the optimizer (e.g. via optim.SGD(model.parameters(), ...)), they will be updated.
How are you checking, if they are updated or not?