3

我想对官方 Optuna 和基于 pytorch 的示例代码(https://github.com/optuna/optuna/blob/master/examples/pytorch_simple.py)使用交叉验证。

考虑过拆分数据进行交叉验证,并尝试对每个折叠进行参数调整,但似乎无法获得每个参数的平均准确度,因为在 study.trials_dataframe() 中可以检查的参数每次都不同。

4

1 回答 1

1

我认为我们需要评估所有折叠并计算目标函数内的平均值。我创建了一个示例笔记本,所以请看一下。

在笔记本中,我稍微修改了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)
于 2020-08-04T07:30:14.143 回答