Thanks for the information.
I think I might have missed these lines in char_LSTM's forward before:
_, self.char_hidden = self.lstm(char_embeds.view(len(single_word),1,-1),self.char_hidden)
self.char_hidden = self.init_hidden()

It seems you should change the order of these lines, since currently you are re-initializing the hidden state in each forward after using your lstm.