With out seeing the data, it’s difficult to say. Here are some questions just some comments that might help:

Is the loss going down at all? That’s actually the first thing to check.
You don’t really use batches but the you training data at once in each epoch. Note that the batch size also affects which learning rate is most suitable.

optimiser. zero_grad(): not sure if the whitespace is just a typo here or Python actually cares 

There seems to be some views() they shouldn’t be needed, I think. Form example, in lstm_out[-1].view(self.batch_size, -1), is the view() really needed? lstm_out should have the shape (seq_len, batch_size, hidden_dim), so taking the last step should have the correct shape of (batch_size, hidden_dim) for the linear layer.
The values of y_train don’t seem to come from data. I don’t know that NGSIM dataset. Are there really just 3,000 items and the first 1,000 are of class 1, the second 1,000 of class 2, and the last 1,000 of class 3. I’m not saying that’s wrong, it just looks odd given that I don’t know the data.
Try using 1 layer for the LSTM first. 3,000 data items are not much for training, particularly when the network is complex.
What does lstm_input_size = 1 mean? In this case you sequence length is 1 and you wouldn’t need a RNN layer at all. Again, together with the X_train.view([input_size, -1, 1]), I feel that something with your data is probably off, not with the model.