Well, you probably need multiple hidden states, one for each LSTM, since the last dimension (i.e., hidden dimension) is different (in your case 100, 200, and 300).
By the way, I also feel that
pred = self.linear(lstm_out.view(len(seq),-1))
return pred[-1]  # we only want the last value

doesn’t make sense.