PyTorch: простая нейронная сеть с прямой связью, не работающая без retain_graph = True - PullRequest
0 голосов
/ 03 марта 2020

Ниже приведен мой код для обучения нейронной сети с прямой связью (FFNN).

Метки - это числа от 0 до 50. FFNN состоит из одного скрытого слоя с 50 нейронами и выходного слоя с 51 нейроном. Кроме того, я использовал потерю вероятности с отрицательным логарифмическим индексом.

Я очень плохо знаком с PyTorch, поэтому для руководства я использовал несколько веб-сайтов. Странно то, что ни один из них не требует, чтобы для retain_graph было задано значение True (они не передают никаких аргументов при вызове backward()). Кроме того, он работает очень медленно, и точность, кажется, колеблется вокруг фиксированного значения, а не уменьшается.

Предполагая, что формат ввода правильный, может кто-нибудь объяснить мне, почему сеть работает так плохо и почему для сети требуется, чтобы для retain_graph было задано значение True?

Большое спасибо!

n_epochs = 2
batch_size = 100
for epoch in range(n_epochs):
    permutation = torch.randperm(training_set.size()[0])
    for i in range(0, training_set.size()[0], batch_size):
        opt.zero_grad()
        indices = permutation[i:i + batch_size]
        batch_features = training_set[indices]
        batch_labels = torch.LongTensor([label for label, sent in train[indices]])
        batch_outputs = model(batch_features)
        loss = loss_function(batch_outputs, batch_labels)
        loss.backward(retain_graph=True)
        opt.step()

1 Ответ

1 голос
/ 03 марта 2020

Вам не хватает .zero_grad() операции. Добавьте это к l oop, и ваш код будет нормально работать без retain_graph= True.

loss.backward()
opt.step()
opt.zero_grad()
...