Полагаю, скрытый тензор - это тенор, который мне нужно инициализировать в начале 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