コード例 #1
0
ファイル: mlp.py プロジェクト: Gleonett/multilayer-perceptron
def evaluate(data, model, scale, device):
    X, y, _, _ = data.split(1, shuffle=False)
    X, y = prep_data(X, y, device)

    X = scale(X)

    model.eval()

    profiler = Profiler("INFERENCE TIME")
    profiler.tick()
    pred = model(X)
    profiler.tock()
    print(profiler, end='\n\n')

    criterion = get_loss('bce')
    error = criterion(pred, y)
    print("loss: {:.4f}".format(error))

    acc = accuracy(torch.argmin(pred, dim=1), y[:, 0])
    print("accuracy: {:.4f}".format(acc))
コード例 #2
0
ファイル: mlp.py プロジェクト: Gleonett/multilayer-perceptron
def train(data, model, scale, config, device):
    from nn.optim.sgd import SGD
    from utils.train_history import TrainHistory

    X_train, y_train, X_test, y_test = data.split(config.train_part,
                                                  shuffle=True)

    assert len(X_train) > 0, "Wrong number of train examples"
    assert len(X_test) > 0, "Wrong number of test examples"

    X_train, y_train = prep_data(X_train, y_train, device)
    X_test, y_test = prep_data(X_test, y_test, device)

    print("first label in train part: {:.2f}%".format(
        y_train[:, 0].sum().float() / y_train.shape[0] * 100))
    print("first label in test part: {:.2f}%".format(
        y_test[:, 0].sum().float() / y_test.shape[0] * 100))

    scale.fit(torch.cat([X_train, X_test], dim=0))
    X_train = scale(X_train)
    X_test = scale(X_test)

    criterion = get_loss(config.loss)
    optimizer = SGD(model, **config.sgd_params)

    profiler = Profiler("TRAIN TIME")
    history = TrainHistory(config.epochs,
                           ["loss", "val_loss", "acc", "val_acc"])

    for i in range(1, config.epochs + 1):
        profiler.tick()
        losses = []
        for batch_X, batch_y in batch_iterator(X_train,
                                               y_train,
                                               config.batch_size,
                                               permute=True):
            output = model(batch_X)

            losses.append(criterion(output, batch_y).to("cpu"))
            grad = criterion.backward(output, batch_y)

            model.backward(grad)

            optimizer.optimise()

        test_pred = model(X_test)
        test_loss = criterion(test_pred, y_test)
        test_acc = accuracy(torch.argmax(test_pred, dim=1),
                            torch.argmax(y_test, dim=1))

        pred = model(X_train)
        acc = accuracy(torch.argmax(pred, dim=1), torch.argmax(y_train, dim=1))

        history.update(i, np.mean(losses), test_loss, acc, test_acc)
        history.print_progress()

        if config.cross_validation:
            idxs = np.random.permutation(
                np.arange(X_train.shape[0] + X_test.shape[0]))

            X = torch.cat([X_train, X_test], dim=0)
            y = torch.cat([y_train, y_test], dim=0)
            train_num = int(X.shape[0] * config.train_part)

            X_train = X[idxs[train_num:]]
            X_test = X[idxs[:train_num]]
            y_train = y[idxs[train_num:]]
            y_test = y[idxs[:train_num]]

        profiler.tock()
    history.visualize()
    print('\n', profiler, sep='', end='\n\n')