예제 #1
0
def train_model_CV(hparams, model_design, X, Y, splits, eval_set, data_dir,
                   save):

    batchsize = hparams["batchsize"]
    epochs = hparams["epochs"]
    seqlen = hparams["history"]
    
    rmse_train = np.zeros((splits, epochs))
    rmse_val = np.zeros((splits, epochs))
    mae_train = np.zeros((splits, epochs))
    mae_val = np.zeros((splits, epochs))

    performance = []
    y_tests = []
    y_preds = []

    #X_mean, X_std = np.mean(X), np.std(X)
    #X = utils.minmax_scaler(X)
    
    if not eval_set is None:
        print("Test set used for model evaluation")
        Xt_test = eval_set["X_test"]
        #Xt_test= utils.minmax_scaler(Xt_test, scaling = [X_mean, X_std])
        Yt_test = eval_set["Y_test"]
        Yt_test = torch.tensor(Yt_test).type(dtype=torch.float)
        Xt_test = torch.tensor(Xt_test).type(dtype=torch.float)
        xt_test, yt_test = utils.create_inout_sequences(Xt_test, Yt_test, "full", seqlen, model="cnn")
        yt_tests = []
        
    kf = KFold(n_splits=splits, shuffle = False)
    kf.get_n_splits(X)

    split=0

    for train_index, test_index in kf.split(X):
        
        X_train, X_test = X[train_index], X[test_index]
        Y_train, Y_test = Y[train_index], Y[test_index]
        
        X_test = torch.tensor(X_test).type(dtype=torch.float)
        Y_test = torch.tensor(Y_test).type(dtype=torch.float)
        X_train = torch.tensor(X_train).type(dtype=torch.float)
        Y_train = torch.tensor(Y_train).type(dtype=torch.float)

        model = models.ConvN(model_design["dimensions"], 
                             model_design["channels"], 
                             model_design["kernelsize"],
                             seqlen, 
                             model_design["activation"])

        optimizer = optim.Adam(model.parameters(), lr = hparams["learningrate"])
        criterion = nn.MSELoss()
        
        x_train, y_train = utils.create_inout_sequences(X_train, Y_train, "full", seqlen, model="cnn")
        x_test, y_test = utils.create_inout_sequences(X_test, Y_test, "full", seqlen, model="cnn")
        
        for epoch in range(epochs):
    
            x, y = utils.create_inout_sequences(X_train, Y_train, batchsize, seqlen, model="cnn")

            # Training
            model.train()
            optimizer.zero_grad()
            output = model(x)
            
            # Compute training loss
            loss = criterion(output, y)
            
            loss.backward()
            optimizer.step()
        
            # Evaluate current model at test set
            model.eval()
            
            with torch.no_grad():
                pred_train = model(x_train)
                rmse_train[split, epoch] = utils.rmse(y_train, pred_train)
                mae_train[split, epoch] = metrics.mean_absolute_error(y_train, pred_train)
                if eval_set is None:
                    pred_test = model(x_test)
                    rmse_val[split, epoch] = utils.rmse(y_test, pred_test)
                    mae_val[split, epoch] = metrics.mean_absolute_error(y_test, pred_test)
                else:
                    pred_test = model(xt_test)
                    rmse_val[split, epoch] = utils.rmse(yt_test,pred_test)
                    mae_val[split, epoch] = metrics.mean_absolute_error(yt_test, pred_test)
            
        with torch.no_grad():
            preds_train = model(x_train)   
            if eval_set is None:
                preds_test = model(x_test)
                performance.append([utils.rmse(y_train, preds_train),
                                    utils.rmse(y_test, preds_test),
                                    metrics.mean_absolute_error(y_train, preds_train),
                                    metrics.mean_absolute_error(y_test, preds_test)])
            else:
                preds_test = model(xt_test)
                performance.append([utils.rmse(y_train, preds_train),
                                    utils.rmse(yt_test,preds_test),
                                    metrics.mean_absolute_error(y_train, preds_train),
                                    metrics.mean_absolute_error(yt_test, preds_test)])
        
        if save:
            #torch.save(model.state_dict(), os.path.join(data_dir, f"model{split}.pth"))
            torch.save(model, os.path.join(data_dir, f"model{split}.pth"))
            
        y_tests.append(y_test.numpy())
        y_preds.append(preds_test.numpy())
        if not eval_set is None:
            yt_tests.append(yt_test.numpy())
            
        split += 1
            
    running_losses = {"rmse_train":rmse_train, "mae_train":mae_train, "rmse_val":rmse_val, "mae_val":mae_val}
    
    if eval_set is None:
        return(running_losses, performance, y_tests, y_preds)
    else:
        return(running_losses, performance, yt_tests, y_preds)
예제 #2
0
#x_test = torch.tensor(x_test).type(dtype=torch.float)
#target_test = torch.tensor(target_test).type(dtype=torch.float)
#%%
hiddensize = [16, 32, 64, 128, 256]
dimensions = [X.shape[1]]
for layer in range(2):
    # randomly pick hiddensize from hiddensize list
    dimensions.append(random.choice(hiddensize))
dimensions.append(Y.shape[1])

model = models.MLP(dimensions, nn.ReLU)

out = model(x)

#%%
x_test, target_test = utils.create_inout_sequences(X, Y, 64, 10, model="cnn")

rmse_train = []
rmse_test = []

model = models.ConvN([X.shape[1], 32, 1], [X.shape[1], 14], 2, 10, nn.ReLU)

optimizer = optim.Adam(model.parameters(), lr=0.01)
criterion = nn.MSELoss()

x_train, y_train = utils.create_inout_sequences(X, Y, "full", 10, model="cnn")

for epoch in range(3000):

    x, target = utils.create_inout_sequences(X, Y, 64, 10, model="cnn")