experiments = experiments[400:]
print("{} experiments about to run.".format(len(experiments)))

for experiment in experiments:
    augment, batch_size, keep_prob, filters, ksize, config = experiment
    start_time = time.time()
    network = NN(epochs=5, batch_size=batch_size, learning_rate=0.001)
    features = np.concatenate([X_train, aug_X
                               ]) if augment == 'True' else X_train
    labels = np.concatenate([y_train, aug_y]) if augment == 'True' else y_train
    network.add_train_data(features, labels)
    network.add_test_data(X_test, y_test)
    network.add_validation_data(X_valid, y_valid)

    network.add_configuration(create_network_config(config, filters, ksize),
                              input_size=input_size)

    network.build(num_labels=num_labels)
    print(
        "Training model with hyperparameters: augmented: {}, batch_size: {}, keep_prob: {}, filters: {}, ksize: {}, config: {}"
        .format(augment, batch_size, keep_prob, filters, ksize,
                network.get_string()))
    validation_accuracy = network.train(keep_prob=keep_prob)

    end_time = time.time()

    stat_values = [
        end_time - start_time, validation_accuracy, augment, batch_size,
        keep_prob, filters, ksize,
        network.get_string()
    ]
        { 'type': 'relu' },
        { 'type': 'flatten' },
        { 'type': 'fc', 'units': 128 },
        { 'type': 'dropout' },
        { 'type': 'relu' },
        { 'type': 'fc', 'units': 43 }
    ]
    start_time = time.time()
    network = NN(epochs=50, batch_size=int(batch_size), learning_rate=0.001)
    features = np.concatenate([X_train, aug_X]) if augment == 'True' else X_train
    labels = np.concatenate([y_train, aug_y]) if augment == 'True' else y_train
    network.add_train_data(features, labels)
    network.add_test_data(X_test, y_test)
    network.add_validation_data(X_valid, y_valid)

    network.add_configuration(architecture, input_size=input_size)

    network.build(num_labels=num_labels)
    validation_accuracy = network.train(keep_prob=keep_prob, save_name="test" + str(idx))

    end_time = time.time()

    test_accuracy = network.test(save_name="test" + str(idx))

    try:
        stats = pd.read_csv('top_5_stats.csv')
    except:
        stats = pd.DataFrame()
    
    stat_values = [end_time - start_time, validation_accuracy, test_accuracy, augment, filters, ksize, batch_size, keep_prob, architecture_name]
    stat_entry = pd.Series(stat_values, index=stat_labels)