Pytorch LSTM регрессия;функция потерь достигает максимума в каждую эпоху - PullRequest
1 голос
/ 04 ноября 2019

Я самостоятельно изучаю pytorch и пытаюсь LSTM применить в регрессия оставшегося полезного времени жизни (RUL) проблема.

Моя матрица ввода состоит из функциипеременные в векторе, складывающиеся вдоль строк [ 2D-матрица временного шага по вектору объектов ] Я загружаю вход с предварительно обработанной DataLoader размером [пакетный размер, длина последовательности, количество перчаток]для каждого enumerate(train_loader)

The training output of RUL for 50th epoch

RUL of the whole run

Я пробовал функции потерь, такие как MSELoss, L1Loss с RMSprop, оптимизатор SGD, и целью является простое снижениеЗначения RUL по временным шагам.

Таким образом, проблема заключается в том, что в каждой эпохе вычисление потерь начинается с нуля по мере продвижения новой эпохи. Это может быть возможно из-за высоких целочисленных значений цели, вызывая высокие значения потерь. Однако, поскольку эпоха повторяется, начальная стоимость потери, как ожидали, уменьшится, так как обучение каким-то образом сделано. но результат не тот, который я ожидал ..

Надеюсь, кто-нибудь сможет мне помочь с этой проблемой. Заранее спасибо .. !!!

по источнику модели:

class GRU(nn.Module):
    def __init__(self, input_dim, hidden_dim, batch_size, window_size, output_dim=1, num_layers=2):
        super(GRU, self).__init__()
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim
        self.batch_size = batch_size
        self.window_size = window_size

        # Define the GRU layer
        self.gru1 = nn.GRU(
                input_size=self.input_dim, 
                hidden_size=hidden_dim,
                bias=True)

        # Define the output layer
        self.linear1 = nn.Linear(hidden_dim, 500)
        self.linear2 = nn.Linear(500, 1)

    def forward(self, input, hidden):
        input=input.transpose(1,0)
        gru_out, self.hidden1 = self.gru1(input.view(self.window_size, self.batch_size, -1), hidden)

        y_pred = self.linear1(gru_out[-1].view(self.batch_size, -1))
        y_pred = self.linear2(y_pred)

        return y_pred.view(-1), self.hidden1.detach()

мой источник поезда:

#input shape: [sequence_length, batch_size, input_size]
#target shape: [batch_size, 1]

for j in range(epoch):
    for i, (dat, target) in enumerate(train_loader):

        out, hidden = model(dat, hidden)
        loss = criterion(out, target.view(-1))
        loss.backward(retain_graph=True)

        optimizer.step()
        optimizer.zero_grad()

        loss_history.append(loss.item())

        if i % 100 == 0:    
            print("{} epoch: {}/{}timestep, time: {}, loss {}:".format(j, i,len(train_loader), round(t2-t1,4), loss))
        RUL=torch.cat((RUL,out.data.view(-1)))

    plt.plot(RUL[-28000:].detach().numpy(), linewidth=0.5)
    plt.show()
...