An accuracy of around 50% for two classes just means that your classifier is guessing, i.e., has not learned anything.
I would first simplify the model as much as, particularity not using a bi-directional LSTM. out_rnn = out_rnn[-1] is only fully correct when you have only one direction. Just because #this works doesn’t mean it’s correct. I would also use just one layer. You can also drop the packing at first. Once a barebone classifier is learning something, then you can add complexity.
For classification I usually use nn.NLLLoss in combination with log_softmax. Maybe you can try that way.