使用pytorch实现LSTM语言模型

网上有很多关于nn.LSTM参数解释,因为我理解不深且较为表面,所以不再复制粘贴

首先明确下文的处理不使用批处理。当在进行文本分析时,即一条一条句子输入。因此,我们可以不用再关注LSTM层的批数据填充。

LSTM的重要参数:batch_first
ss:句子长度,b:batch_size,e:embedding_dim,h:hid_dim

  1. batch_first=F(默认)
    • 输入:(s,b,e)
    • 输出:(s,b,h)
  2. batch_first=T
    • 输入:(b,s,e)
    • 输出:(b,s,h)

因为不使用批处理,batch_size=1

问题来了,输入输出LSTM的数据是四维的,这里需要输出输入进行维度重构

方法(具体用法请baidu):

  1. unsqueeze(0),squeeze(0)
  2. .view()
class LSTM_LM(nn.Module):
  
  def __init__(self,vocab_size, embedding_dim,hid_dim=128):
    super(LSTM_LM, self).__init__()
    self.embeddings = nn.Embedding(vocab_size, embedding_dim)
    self.linear1=nn.LSTM(embedding_dim,hid_dim)
    self.linear2=nn.Linear(hid_dim,vocab_size)

  def forward(self, inputs):
    embeds = self.embeddings(inputs)
    embeds=embeds.view(embeds.shape[0],1,-1)
    out,_=self.linear1(embeds)
    s,_,_=out.size()
    out = self.linear2(out.view(s,-1))
    log_probs = F.log_softmax(out, dim=1)
    return log_probs
class LSTM_LM(nn.Module):
  
  def __init__(self,vocab_size, embedding_dim,hid_dim=128):
    super(LSTM_LM, self).__init__()
    self.embeddings = nn.Embedding(vocab_size, embedding_dim)
    self.linear1=nn.LSTM(embedding_dim,hid_dim,batch_first=True)
    self.linear2=nn.Linear(hid_dim,vocab_size)

  def forward(self, inputs):
    embeds = self.embeddings(inputs).unsqueeze(0)
    out,_=self.linear1(embeds)
    out=out.squeeze(0)
    out = self.linear2(out)
    log_probs = F.log_softmax(out, dim=1)
    return log_probs
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐