Как я могу выполнить перекрестную проверку Pytorch и Optuna - PullRequest
1 голос
/ 03 августа 2020

Я хочу использовать перекрестную проверку по официальному образцу кода на основе Optuna и pytorch (https://github.com/optuna/optuna/blob/master/examples/pytorch_simple.py).

Я подумал о разделении данных для перекрестной проверки и попробовал настройка параметров для каждой свертки, но кажется, что средняя точность каждого параметра не может быть получена, потому что параметры, которые можно проверить в study.trials_dataframe (), каждый раз разные.

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, нам нужно оценить все складки и вычислить среднее значение внутри целевой функции. Я создаю пример записной книжки , поэтому, пожалуйста, взгляните.

В записной книжке я немного изменил функцию objective, чтобы передать набор данных с аргументами и добавил функцию-оболочку objective_cv для вызова функции objective с разделенным набором данных. Затем я оптимизировал функцию objective_cv вместо objective.

def objective(trial, train_loader, valid_loader):

    # Remove the following line.
    # train_loader, valid_loader = get_mnist()

    ...

    return accuracy


def objective_cv(trial):

    # Get the MNIST dataset.
    dataset = datasets.MNIST(DIR, train=True, download=True, transform=transforms.ToTensor())

    fold = KFold(n_splits=3, shuffle=True, random_state=0)
    scores = []
    for fold_idx, (train_idx, valid_idx) in enumerate(fold.split(range(len(dataset)))):
        train_data = torch.utils.data.Subset(dataset, train_idx)
        valid_data = torch.utils.data.Subset(dataset, valid_idx)

        train_loader = torch.utils.data.DataLoader(
            train_data,
            batch_size=BATCHSIZE,
            shuffle=True,
        )
        valid_loader = torch.utils.data.DataLoader(
            valid_data,
            batch_size=BATCHSIZE,
            shuffle=True,
        )

        accuracy = objective(trial, train_loader, valid_loader)
        scores.append(accuracy)
    return np.mean(scores)


study = optuna.create_study(direction="maximize")
study.optimize(objective_cv, n_trials=20, timeout=600)
...