From what I can see from having a quick look at your code:

The shape of x after self.emb(x) should be (batch_size, seq_len, embed_dim)

So batch_size = x.size(1) gives you the wrong value
In your code you NOT use batch_first=True, but the batch is in fact the first dimension x (this is probably the reason why the network throws no error despite the wrong batch_size)

There are two approaches to do this
(1) batch_first=False
 def forward(self, x):
    batch_size = x.size(0)
    x = self.embed(x) # shape = (batch_size, seq_len, embed_dim)
    x = x.transpose(0, 1) # shape = (seq_len, batch_size, embed_dim)
    h0, c0 = self.zero_state(batch_size)
    out, (hn, cn) = self.lstm(x, (h0, c0))
    out = self.fc(hn[-1, :, :])
    return out

(2) batch_first=True
 def forward(self, x):
    batch_size = x.size(0)
    x = self.embed(x) # shape = (batch_size, seq_len, embed_dim)
    h0, c0 = self.zero_state(batch_size)
    out, (hn, cn) = self.lstm(x, (h0, c0))
    out = self.fc(hn[-1, :, :])
    return out