Pytorch LSTM каждая эпоха начинается с 0 точности - PullRequest
0 голосов
/ 01 июля 2018

Я тренирую модель LSTM для прогнозирования временных рядов , и в в каждую эпоху моя точность начинается с 0, как будто я тренируюсь впервые .

Я прилагаю ниже фрагмент метода обучения:

def train(model, loader, epoch, mini_batch_size, sequence_size):
model.train()
correct = 0
padded_size = 0
size_input = mini_batch_size * sequence_size
for batch_idx, (inputs, labels, agreement_score) in enumerate(loader):


    if(inputs.size(0) == size_input):
        inputs = inputs.clone().reshape(mini_batch_size, sequence_size, inputs.size(1))
        labels = labels.clone().squeeze().reshape(mini_batch_size*sequence_size)
        agreement_score = agreement_score.clone().squeeze().reshape(mini_batch_size*sequence_size)
    else:
        padded_size = size_input - inputs.size(0)
        (inputs, labels, agreement_score) = padd_incomplete_sequences(inputs, labels, agreement_score, mini_batch_size, sequence_size)



    inputs, labels, agreement_score = Variable(inputs.cuda()), Variable(labels.cuda()), Variable(agreement_score.cuda())


    output = model(inputs)


    loss = criterion(output, labels)
    loss = loss * agreement_score
    loss = loss.mean()

    optimizer.zero_grad()
    loss.backward()

    optimizer.step()

    pred = output.data.max(1, keepdim = True)[1]
    correct += pred.eq(labels.data.view_as(pred)).cuda().sum()

    accuracy = 100. * correct / (len(loader.dataset) + padded_size)

    print("Train: Epoch: {}, [{}/{} ({:.0f}%)]\t loss: {:.6f}, Accuracy: {}/{} ({:.0f}%)".format(
        epoch,
        batch_idx * len(output),
        (len(loader.dataset) + padded_size),
        100. * batch_idx / (len(loader.dataset)+padded_size),
        loss.item(),
        correct,
        (len(loader.dataset) + padded_size),
        accuracy))

accuracy = 100. * correct / (len(loader.dataset) + padded_size)

train_accuracy.append(accuracy)
train_epochs.append(epoch)
train_loss.append(loss.item())

В соответствии с этим мой цикл выглядит так:

for epoch in range(1, 10):
    train(audio_lstm_model, train_rnn_audio_loader, epoch, MINI_BATCH_SIZE, SEQUENCE_SIZE_AUDIO)
    evaluation(audio_lstm_model,validation_rnn_audio_loader, epoch, MINI_BATCH_SIZE, SEQUENCE_SIZE_AUDIO)

Следовательно, моя точность и потеря возобновляются в каждую эпоху:

Train: Epoch: 1, [0/1039079 (0%)]    loss: 0.921637, Accuracy: 0/1039079 (0%)
...
Train: Epoch: 1, [10368/1039079 (0%)]    loss: 0.523242, Accuracy: 206010/1039079 (19%)
Test set: loss: 151.4845, Accuracy: 88222/523315 (16%)
Train: Epoch: 2, [0/1039079 (0%)]    loss: 0.921497, Accuracy: 0/1039079 (0%)

Если у кого-то есть подсказки, ваша помощь приветствуется! Хорошего дня!

1 Ответ

0 голосов
/ 02 июля 2018

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

...