Функция потери автоэнкодера LSTM - PullRequest
0 голосов
/ 10 мая 2019

Я хочу обучить модель автоэнкодера lstm, которая отображает входные данные x (с формой [batch_size, timestamp, feature]) на выход, который является тем же самым x (с точно такой же формой).В этой задаче я не уверен, какую функцию потерь мне следует использовать.

Я пробовал использовать функцию потерь с евклидовым расстоянием, а также с MseLoss, но я не уверен, как мне организовать свои данные дляпотеря.Например, давайте выберем в качестве функции потерь евклидово расстояние, каким должны быть данные?Должен ли я рассчитывать для каждой последовательности / образца партии евклидово расстояние и затем усреднять потери для всей партии?или я должен суммировать (или усреднить) потери каждого временного шага в последовательности / образце, а затем взять среднее по партии?

class LSTM_FC(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers):
        super(LSTM_FC, self).__init__()
        self.in_size = input_size
        self.hidden_size = hidden_size
        self.nb_lstm_layers = num_layers
        self.dropout = nn.Dropout(0.5)
        self.relu = nn.ReLU()

        self.lstm = nn.LSTM(input_size=self.in_size, 
             hidden_size=self.hidden_size, num_layers=self.nb_lstm_layers, 
             batch_first=True)
        self.fc = nn.Linear(self.hidden_size, self.in_size)

    def forward(self, x):
        out, h_state = self.lstm(x)
        out = self.dropout(out)

        output_fc = []
        for frame in out:
            #print(frame.shape)
            output_fc.append( self.fc(frame) )
            # Fully connected layer to each frame

        output_fc_ = torch.stack(output_fc)
        output_fc_ = self.relu(output_fc_)
        return output_fc_  # The output has the same shape as the input
 ae_optimizer = optim.Adam( LSTM_FC.parameters(), lr=0.0001, 
                          weight_decay=0.0001) 
 criterion = nn.MSELoss()

 for epoch_i in trange(200, desc='Epoch', ncols=80):
      for batch_i, image_features in enumerate(tqdm(self.train_loader, 
                    desc='Batch', ncols=80, leave=False)): 
           self.ae_optimizer.zero_grad() 
           image_features = Variable(image_features).cuda()
           generated_features = LSTM_FC(image_features)

           reconstruction_loss = self.criterion(generated_features.float(), 
           reconstruction_loss .backward() # Backward pass                 
           torch.nn.utils.clip_grad_norm_(self.model.parameters(), 
                                   self.config.clip)
           self.ae_optimizer.step() # Update parameters

Потеря, кажется, уменьшается, но не стот же показатель для набора обучения и набора проверки.Я имею в виду, что на тренировках потеря действительно мала, но в проверочном наборе потеря примерно в 4-5 раз больше потери на тренировке.Эта проблема вызвана функцией потери?Если да, как я могу подготовить свои данные для функции потери?Некоторая помощь, пожалуйста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...