Я пытаюсь перебить один временной ряд.Смысл, я пытаюсь выполнять тренировку на одной (X,Y)
паре снова и снова.Я делаю это, чтобы получить представление о возможностях гиперпараметров.Но это не сходится.Это график потерь, показывающий MSE на итерацию после примерно 800 итераций:
Я надеялся, что ошибка полностью исчезает, но она застревает наПлато, где он все еще находится, как я пишу это.Временной ряд имеет длину 29600
, и RNN отображает одно значение в другое одно значение.Он состоит из ячейки LSTM с входом 1
, скрытых единиц 200
и полностью подключенного слоя, отображающего одно значение
Мне кажется, что модель может быть недостаточно сложной, чтобы соответствовать образцу,Но прежде чем я попытаюсь увеличить сложность RNN, я должен быть уверен, что мое обучение прошло правильно.Может быть, я не правильно использовал autograd.Так как это первый раз, когда я пытался обучить нейронную сеть, я не знаю, сколько времени это займет.
import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable
import numpy as np
# the class containing the LSTM
class Sequence(nn.Module):
def __init__(self):
self.hidden_state_len = 200
super(Sequence, self).__init__()
self.lstm1 = nn.LSTMCell(1, self.hidden_state_len)
self.linear = nn.Linear(self.hidden_state_len, 1)
h_t = torch
def forward(self, input):
outputs = []
h_t = torch.zeros(input.size(0), self.hidden_state_len, dtype=torch.double).cuda()
c_t = torch.zeros(input.size(0), self.hidden_state_len, dtype=torch.double).cuda()
for i, input_t in enumerate(input.chunk(input.size(1), dim=1)):
h_t, c_t = self.lstm1(input_t, (h_t, c_t))
output = self.linear(h_t)
outputs += [output]
return torch.cat(outputs, dim=1)
x1 = torch.load("/floyd/input/wav/x1.pt").double().cuda()[0][7400:37000].reshape(1,-1)
y1 = torch.load("/floyd/input/wav/y1.pt").double().cuda()[0][7400:37000].reshape(1,-1)
seq = Sequence()
seq.double()
criterion = nn.MSELoss()
seq = seq.cuda()
device = torch.device("cuda:0")
seq = seq.to(device)
optimizer = optim.Adam(seq.parameters())
starttime = datetime.datetime.now()
i = -1
# training for 4 hours on cloud GPU
while((datetime.datetime.now() - starttime).total_seconds() < 60*60*4) :
i+=1
optimizer.zero_grad()
input = Variable(x1)
target = Variable(y1)
out = seq(input)
loss = criterion(out, target)
loss.backward()
optimizer.step()