Как я могу выполнить перекрестную проверку Pytorch и Optuna
Я хочу использовать перекрестную проверку по официальному образцу кода на основе Optuna и pytorch ( https://github.com/optuna/optuna/blob/master/examples/pytorch_simple.py).
Я думал о разделении данных для перекрестной проверки и попытке настройки параметров для каждой свертки, но кажется, что средняя точность каждого параметра не может быть получена, потому что параметры, которые можно проверить в study.trials_dataframe(), каждый раз разные.
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)