Я сталкиваюсь с проблемой: «RuntimeError: входные и скрытые тензоры не на одном устройстве, найденный входной тензор в cuda: 0 и скрытый тензор в процессоре» - PullRequest
0 голосов
/ 15 января 2020

Полагаю, скрытый тензор - это тенор, который мне нужно инициализировать в начале RNN. Поэтому я установил h0 и c0 с помощью .cuda (), но это бесполезно. Ниже приведен мой код. Пожалуйста, кто может дать мне руку?

class LSTM_net(nn.Module):
def __init__(self, Embedding, vocab, label, batch):
    super(LSTM_net, self).__init__()
    self.Hidden_dim = Embedding
    self.Embedding = nn.Embedding(vocab, Embedding)  
    self.lstm = nn.LSTM(Embedding, self.Hidden_dim)  # 32 * 32
    self.hidden2label = nn.Linear(Embedding, label)
    self.hidden = self.init_hidden(batch)

def init_hidden(self, batch):  
    # the first is the hidden h
    # the second is the cell c

    if torch.cuda.is_available():
        return (autograd.Variable(torch.zeros(1, batch, self.Hidden_dim)),
                autograd.Variable(torch.zeros(1, batch, self.Hidden_dim)))
    else:
        return (autograd.Variable(torch.zeros(1, batch, self.Hidden_dim).cuda()),
                autograd.Variable(torch.zeros(1, batch, self.Hidden_dim).cuda()))

def forward(self, sentence):
    # 64 * 52
    x = self.Embedding(sentence)
    # x = 64 * 52 * 32
    x = x.permute(1, 0, 2)
    # x = 52 * 64 * 32
    lstm_y, lstm_hidden = self.lstm(x, self.hidden)
    # lstm_y = batch * 52 * 32
    # input: lstm_y[-1] = batch * 32
    y = self.hidden2label(lstm_y[-1])
    # y = batch * 5
    log_probs = F.log_softmax(y)
    return log_probs
...