【问题标题】:Forward Propagate RNN using Pytorch使用 Pytorch 前向传播 RNN
【发布时间】:2023-03-29 03:55:01
【问题描述】:

我正在尝试创建一个 RNN 前向传递方法,该方法可以采用可变的输入、隐藏和输出大小并创建所需的 rnn 单元。对我来说,似乎我正在将正确的变量传递给 self.rnn_cell——x 和前一个隐藏层的输入值。但是,我收到的错误包含在下面。

我也尝试过使用 x[i] 和 x[:,i,i] (正如我的教授所建议的那样),但无济于事。我很困惑,只是在寻找关于我是否在这里做正确的事情的指导。我的教授建议,由于我不断收到错误,我应该在 jupyter notebook 中重新启动内核并重新运行代码。我有,我收到同样的错误......

如果您需要其他上下文,请告诉我。

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size

        self.rnn_cell = nn.RNNCell(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, output_size)
        self.softmax = nn.LogSoftmax(dim=1)

    def forward(self, x):
        """
        x: size [seq_length, 1, input_size]
        """
        h = torch.zeros(x.size(1), self.hidden_size)

        for i in range(x.size(0)):
            ### START YOUR CODE ###
            h = self.rnn_cell(x[:,:,i], h)
            ### END YOUR CODE ###

        ### START YOUR CODE ###
        # Hint: first call fc, then call softmax
        out = self.softmax(self.fc(self.hidden_size, h.size(0)))
        ### END YOUR CODE ###

        return out 
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

【问题讨论】:

    标签: python machine-learning pytorch recurrent-neural-network


    【解决方案1】:

    我不是 RNN 方面的专家,但可以尝试一下。

    class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(RNN, self).__init__()
        self.hidden_size = hidden_size
    
        self.rnn_cell = nn.RNN(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, output_size)
    
    
    def forward(self, x):
        """
        x: size [seq_length, 1, input_size]
        """
        h = torch.zeros(num_layers(hidden), x.size(0), self.hidden_size)
    
    
            ### START YOUR CODE ###
        out,hidden = self.rnn_cell(x, h)
            ### END YOUR CODE ###
    
        ### START YOUR CODE ###
        # Hint: first call fc, then call softmax
        out = out.contiguous().view(-1, self.hidden_dim) #You need to reshape the output to fit the FC layer
        out = self.fc(out)
        return F.softmax(out)
        ### END YOUR CODE ###
    
        return out 
    

    请尝试运行它,如果出现错误或任何疑问,请告诉我。 (不能向您询问详细信息,因为我无法评论 rn。)

    如果您对我的回答有任何想法,请支持。

    【讨论】:

      【解决方案2】:
      class RNN(nn.Module):
          def __init__(self, input_size, hidden_size, output_size):
              super(RNN, self).__init__()
              self.hidden_size = hidden_size
      
              self.rnn_cell = nn.RNNCell(input_size, hidden_size)
              self.fc = nn.Linear(hidden_size, output_size)
              self.softmax = nn.LogSoftmax(dim=1)
      
          def forward(self, x):
              """
              x: size [seq_length, 1, input_size]
              """
              h = torch.zeros(x.size(1), self.hidden_size)
      
              for i in range(x.size(0)):
                  ### START YOUR CODE ###
                  h = self.rnn_cell(x[i,:,:], h)
                  ### END YOUR CODE ###
      
              ### START YOUR CODE ###
              # Hint: first call fc, then call softmax
              out = self.fc(h)
              out = self.softmax(out)
              ### END YOUR CODE ###
      
              return out
      

      【讨论】:

      • 请在答案中添加更多内容,解释为什么 OP 应该使用您的代码以及它如何解决他们的问题。就目前而言,您所做的更改并不是很明显。
      【解决方案3】:
      class RNN(nn.Module):
          def __init__(self, input_size, hidden_size, output_size):
              super(RNN, self).__init__()
              self.hidden_size = hidden_size
      
              self.rnn_cell = nn.RNNCell(input_size, hidden_size)
              self.fc = nn.Linear(hidden_size, output_size)
              self.softmax = nn.LogSoftmax(dim=1)
      
          def forward(self, x):
              """
              x: size [seq_length, 1, input_size]
              """
              h = torch.zeros(x.size(1), self.hidden_size)
      
              for i in range(x.size(0)):
                  ### START YOUR CODE ###
                  h = self.rnn_cell(x[i,:,:], h)
                  ### END YOUR CODE ###
      
              ### START YOUR CODE ###
              # Hint: first call fc, then call softmax
              out = self.softmax(self.fc(h))
              ### END YOUR CODE ###
      
              return out
      

      【讨论】:

      • 请在答案中添加更多内容,解释为什么 OP 应该使用您的代码以及它如何解决他们的问题。就像现在一样,您所做的更改并不是很明显。此外,您提出的解决方案似乎与 Dev Taylor 的答案基本相同。
      猜你喜欢
      • 2017-05-24
      • 2021-12-14
      • 2017-05-13
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多