Я хочу обучить модель автоэнкодера 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 раз больше потери на тренировке.Эта проблема вызвана функцией потери?Если да, как я могу подготовить свои данные для функции потери?Некоторая помощь, пожалуйста