#pytorch #recurrent-neural-network
#pytorch #рекуррентная нейронная сеть
Вопрос:
У меня есть матрица размером m x n, и я хочу предсказать по 1 x n вектору (x на картинке со структурой сети) всю следующую (m-1) x n матрицу (y ^ {i} на картинке), используя RNN или LSTM, я не понимаю, какчтобы реализовать передачу каждого вектора 1 x n в следующее скрытое состояние и получить все (m-1) x n векторов одновременно и как вычислить ошибку по всем y ^ {i}
У меня есть эта ванильная RNN-модель, и я не знаю, как ее изменить
class RNNModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
super(RNNModel, self).__init__()
self.hidden_dim = hidden_dim
self.layer_dim = layer_dim
# (batch_dim, seq_dim, feature_dim)
self.RNN = nn.RNN(input_dim, hidden_dim, layer_dim, batch_first=True, nonlinearity='tanh')
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
# Initialize hidden state with zeros
h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()
out, h_t = self.RNN(x, h0)
#out = self.fc(h_t[:, -1, :])
out = self.fc(out[:, -1, :])
return out
Ответ №1:
Стейнли, попробуй это: вы инициируете скрытое состояние, только если другое скрытое состояние не передается. затем вы возвращаете скрытое состояние и передаете его forward()
на следующей итерации.
def forward(self, x, h=None):
if h is None: # if no hidden state is passed
h = torch.zeros( # Initialize hidden state with zeros
self.layer_dim, x.size(0),
self.hidden_dim).requires_grad_()
out, h_t = self.RNN(x, h)
out = self.fc(out[:, -1, :])
return out, h_t
в обучающем коде вы запускаете цикл следующим образом::
x = seed
h = None
for i in range (...)
optimizer.zero_grad()
...
x, h = model.forward (x, h)
...
loss = ...
loss.backward()
optimizer.step()