The code looks fine.
You should initialize the criterion as nn.CrossEntropyLoss, but that’s a minor issue.
Also, don’t use the .data attribute, as it’s deprecated and might yield unwanted side effects.
As the loss goes down, the model is in fact training.
I would recommend to try out different optimizers (e.g. Adam) and also play around with some hyperparameters (e.g. learning rate).
If that doesn’t help, try to overfit a small data sample and make sure your model is able to overfit these samples ~perfectly.