繁体   English   中英

我应该如何在 pytorch LSTM 模型中使用 num_layers?

[英]How should I use num_layers in pytorch LSTM model?

嗨,我是 RNN 和 pytorch 的新手。 我正在实施一个模型来预测数据。 我首先只使用单层,结果很好。 现在我想提高模型的准确性,并想在 LSTM 中使用 2 层。 但是,LSTM 的输出对我来说很奇怪。

我期待有一个 [1, 8] 输出。 但是,使用num_layers=2我得到 [2, 8] 结果。 这个结果什么意思? 我应该使用哪个作为 LSTM 的结果?

这是我的代码:

class LSTM(nn.Module):

    def __init__(self, input_dim, hidden_dim, num_layers, output_dim):

        super(LSTM, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.hidden_dim = hidden_dim
        self.num_layers = num_layers

        self.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim,
                            num_layers=num_layers, batch_first=True)
        
        self.fc = nn.Linear(hidden_dim, output_dim)

    
    def forward(self, x):

        #x = Variable(torch.Tensor(x).cuda())
        
        h_0 = Variable(torch.zeros(
            self.num_layers, x.size(0), self.hidden_dim).cuda())
        
        c_0 = Variable(torch.zeros(
            self.num_layers, x.size(0), self.hidden_dim).cuda())
        
        
        # Propagate input through LSTM
        ula, (h_out, _) = self.lstm(x, (h_0, c_0))
         
        
        out = self.fc(h_out).cuda()
        
        return out

h_out 的形状为 (hidden_​​size,numlayers)。 如果要将其传递给输出层 fc,则需要对其进行整形/展平,并将输出层的大小增加到 hidden_​​size*numlayers。

class LSTM(nn.Module):

    def __init__(self, input_dim, hidden_dim, num_layers, output_dim):

        super(LSTM, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.hidden_dim = hidden_dim
        self.num_layers = num_layers

        self.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim,
                            num_layers=num_layers, batch_first=True)
        
        self.fc = nn.Linear(hidden_dim*num_layers, output_dim)

    
    def forward(self, x):

        #x = Variable(torch.Tensor(x).cuda())
        
        h_0 = Variable(torch.zeros(
            self.num_layers, x.size(0), self.hidden_dim).cuda())
        
        c_0 = Variable(torch.zeros(
            self.num_layers, x.size(0), self.hidden_dim).cuda())
        
        
        # Propagate input through LSTM
        ula, (h_out, _) = self.lstm(x, (h_0, c_0))
         
        out = h_out.transpose(0,1)
        out = out.reshape(-1,hidden_dim*num_layers)
        out = self.fc(out).cuda()
        
        return out

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM