LBFGS в полной партии Pytorch? - PullRequest
       22

LBFGS в полной партии Pytorch?

1 голос
/ 26 сентября 2019

Я пытаюсь реализовать нейронную сеть с помощью оптимизатора LBFGS.Вот мой код

model2 = torch.nn.Sequential()

# ANN with layer 122 -> 25 -> 2
model2.add_module("input_layer", torch.nn.Linear(D, 25))
model2.add_module("relu1", torch.nn.ReLU())
model2.add_module("hidden_layer", torch.nn.Linear(25, K))
model2.add_module("output", torch.nn.Sigmoid())

loss2 = torch.nn.BCEWithLogitsLoss()

optimizer2 = optim.LBFGS(model2.parameters())

Когда я использую мини-партии и пытаюсь напечатать стоимость и точность, я получаю одинаковые точные значения для каждой партии.(Я изменил оптимизатор и заметил, что значения меняются в зависимости от используемой мини-партии).Но когда я изменил размер партии на длину данных поезда (полная партия), я заметил, что модель значительно улучшилась.Являются ли алгоритмы LBFGS полной пакетной обработки в pytorch?

Мой второй вопрос касается функции стоимости и функции окончательной активации.Как видите, я использовал torch.nn.BCEWithLogitsLoss (), который объединяет слой Sigmoid и BCELoss в одном классе.По ошибке я добавил слой Sigmoid в свою модель и заметил, что модель работает немного быстрее, чем я ожидал (потому что я знаю, что LBFGS немного медленны).Но я закомментировал строку model2.add_module("output", torch.nn.Sigmoid()), на этот раз код работает медленнее (обычно медленный х), когда я использую LBFGS).Почему это?я должен сохранить последнюю строку или удалить ее?

РЕДАКТИРОВАТЬ

Вот копия моего кода для обучения

print("Training neural network...")
# main training loop
for i in range(epochs):
    cost = 0
    val_cost = 0
    for xb,yb in train_dl:
        cost += train(model2, loss2, optimizer2, xb, yb, True)

    train_acc = my_score(model2, Xtrain, Ytrain)
    val_acc = my_score(model2, Xval, Yval) 
    val_cost = get_cost(model2, loss2, Xval, Yval)

    print("Epoch: %d, cost: %f, acc: %.4f" % (i, val_cost, val_acc))

    # for plotting
    train_costs2.append(cost / len(train_dl))
    train_accuracies2.append(train_acc)
    validation_costs2.append(val_cost)
    validation_accuracies2.append(val_acc)

print("Training is done")

Вотвывод.

Training neural network...
Epoch: 0, cost: 0.693148, acc: 0.5398
Epoch: 1, cost: 0.693148, acc: 0.5398
Epoch: 2, cost: 0.693148, acc: 0.5398
Epoch: 3, cost: 0.693148, acc: 0.5398
Epoch: 4, cost: 0.693148, acc: 0.5398
Epoch: 5, cost: 0.693148, acc: 0.5398
Epoch: 6, cost: 0.693148, acc: 0.5398
Epoch: 7, cost: 0.693148, acc: 0.5398
Epoch: 8, cost: 0.693148, acc: 0.5398
Epoch: 9, cost: 0.693148, acc: 0.5398
Epoch: 10, cost: 0.693148, acc: 0.5398
Epoch: 11, cost: 0.693148, acc: 0.5398
Epoch: 12, cost: 0.693148, acc: 0.5398
Epoch: 13, cost: 0.693148, acc: 0.5398
Epoch: 14, cost: 0.693148, acc: 0.5398
Training is done

Как видите, значения одинаковы в каждой эпохе.(Я знаю, что моя модель не очень хорошо)

...