0
votes

Transférer la propagation de RNN en utilisant PyTorch

J'essaie de créer une méthode Pass en avant RNN pouvant prendre une taille variable d'entrée, masquée et de sortie et de créer les cellules RNN nécessaires. Pour moi, il semble que je passe les variables correctes à self.rnn_cell - les valeurs d'entrée de x et la couche cachée précédente. Cependant, l'erreur que je reçois est incluse ci-dessous.

J'ai aussi essayé d'utiliser X [i] et x [:, I, I] (comme suggéré par mon professeur) en vain. Je suis confus et je cherche juste des conseils quant à savoir si je fais ou non la bonne chose ici. Mon prof a suggéré que, puisque je continue à recevoir des erreurs, je devrais redémarrer le noyau dans Jupyter Notebook et Code Rerun. J'ai, et je reçois les mêmes erreurs ...

S'il vous plaît laissez-moi savoir si vous avez besoin de contexte supplémentaire. xxx


0 commentaires

3 Réponses :


1
votes

Je ne suis pas un expert à des RNNS, mais je leur donne un essai.

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 


0 commentaires

0
votes
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

1 commentaires

Veuillez ajouter plus à la réponse qui explique pourquoi l'OP devrait utiliser votre code et comment il résout son problème. Comme c'est maintenant ce n'est pas vraiment évident, quels changements avez-vous faits.



0
votes
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

1 commentaires

Veuillez ajouter plus à la réponse qui explique pourquoi l'OP devrait utiliser votre code et comment il résout son problème. Comme c'est maintenant ce n'est pas vraiment évident, quels changements avez-vous faits. De plus, il semble que votre solution proposée soit fondamentalement identique à la réponse faite par Dev Taylor.