예제 #1
0
def testRun():
    # MNIST dataset
    train_dataset = torchvision.datasets.MNIST(root='/data',
                                               train=True,
                                               transform=transforms.ToTensor(),
                                               download=True)

    cv_splits = 3
    kfold = KFold(n_splits=cv_splits, shuffle=True, random_state=0)
    for fold_idx, (train_idx,
                   valid_idx) in enumerate(kfold.split(train_dataset)):
        print(">> CV fold step ", str(fold_idx))
        # cnn model
        model = mlp.SimpleMLP(output_classes).to(device)
        # Loss and optimizer
        criterion = nn.CrossEntropyLoss()
        optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

        # Data loader
        train_loader = DataLoader(Subset(train_dataset, train_idx),
                                  batch_size=batch_size,
                                  shuffle=True)

        # Training
        mnist_trainer = trainer.MLPTrainer(train_loader,
                                           model=model,
                                           cri=criterion,
                                           opt=optimizer,
                                           device=device)
        train_result = mnist_trainer.Execute(epochs)
예제 #2
0
def RunTorchCV():

    with mlflow.start_run():

        # MNIST dataset
        train_dataset = torchvision.datasets.MNIST(
            root='/data',
            train=True,
            transform=transforms.ToTensor(),
            download=True)

        train_results = {}
        valid_results = {}

        cv_splits = 3
        kfold = KFold(n_splits=cv_splits, shuffle=True, random_state=0)
        for fold_idx, (train_idx,
                       valid_idx) in enumerate(kfold.split(train_dataset)):
            print(">> CV fold step ", str(fold_idx))
            # cnn model
            model = mlp.SimpleMLP(output_classes).to(device)
            # Loss and optimizer
            criterion = nn.CrossEntropyLoss()
            optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

            # Data loader
            train_loader = DataLoader(Subset(train_dataset, train_idx),
                                      batch_size=batch_size,
                                      shuffle=True)
            valid_loader = DataLoader(Subset(train_dataset, valid_idx),
                                      batch_size=batch_size,
                                      shuffle=False)

            # Training
            mnist_trainer = trainer.MLPTrainer(train_loader,
                                               model=model,
                                               cri=criterion,
                                               opt=optimizer,
                                               device=device)
            train_result = mnist_trainer.Execute(epochs)
            trained_model = mnist_trainer.GetModel()
            train_results[fold_idx] = train_result

            # Validation
            mnist_validator = validator.MLPValidator(valid_loader,
                                                     model=trained_model,
                                                     criterion=criterion,
                                                     device=device)
            valid_result = mnist_validator.Validate()
            valid_results[fold_idx] = valid_result

        mlflow.log_param("method_name",
                         mlp.SimpleMLP(output_classes).__class__.__name__)
        mlflow.log_param("output_class", output_classes)
        mlflow.log_param("batch_size", batch_size)
        mlflow.log_param("learning_rate", learning_rate)

        mlflow.log_param("fold_type", kfold.__class__.__name__)
        mlflow.log_param("n_splits", cv_splits)
        mlflow.log_param("random_state", 0)

        mlflow.log_param("criterion", nn.CrossEntropyLoss.__class__.__name__)
        mlflow.log_param("optimizer", torch.optim.Adam.__name__)

        average_loss = 0
        average_acc = 0
        for fold_idx, cv_result in train_results.items():
            loss = cv_result[cv_splits - 1]["loss"]
            acc = cv_result[cv_splits - 1]["accuracy"]
            average_loss += loss
            average_acc += acc
            mlflow.log_metric("fold_" + str(fold_idx) + "_loss", loss)
            mlflow.log_metric("fold_" + str(fold_idx) + "_accuracy", acc)

        average_loss = average_loss / cv_splits
        average_acc = average_acc / cv_splits
        mlflow.log_metric("average_loss", average_loss)
        mlflow.log_metric("average_acc", average_acc)

    return valid_results