I think you should call
hidden = net.init_hidden(batch_size)

for every batch because, the hidden state after a batch pass contains information about the whole previous batch. At test time you’d only have a new hidden state for every sentence so you probably want to train for that.