def trainer(hyperp, run_options, file_paths):
    #=== GPU Settings ===#
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    os.environ["CUDA_VISIBLE_DEVICES"] = run_options.which_gpu

    #=== Load Data ===#
    obs_indices, parameter_train, state_obs_train,\
    parameter_test, state_obs_test,\
    data_input_shape_temp, parameter_dimension\
    = load_thermal_fin_data(file_paths, run_options.num_data_train, run_options.num_data_test, run_options.parameter_dimensions)
    output_dimensions_temp = len(obs_indices)

    #=== Forward or Inverse Mapping Input and Output Dimensions ===#
    if run_options.forward_mapping == 1:
        data_input_shape = data_input_shape_temp
        output_dimensions = output_dimensions_temp
    if run_options.inverse_mapping == 1:
        data_input_shape = np.array([output_dimensions_temp, 1])
        output_dimensions = data_input_shape_temp[0]

    #=== Construct Validation Set and Batches ===#
    if run_options.forward_mapping == 1:
        parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
        run_options.num_data_train, num_data_val, run_options.num_data_test,\
        num_batches_train, num_batches_val, num_batches_test\
        = form_train_val_test_batches(parameter_train, state_obs_train, parameter_test, state_obs_test, hyperp.batch_size, run_options.random_seed)

    if run_options.inverse_mapping == 1:
        parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
        run_options.num_data_train, num_data_val, run_options.num_data_test,\
        num_batches_train, num_batches_val, num_batches_test\
        = form_train_val_test_batches(state_obs_train, parameter_train, state_obs_test, parameter_test, hyperp.batch_size, run_options.random_seed)

    #=== Neural network ===#
    if run_options.use_L1 == 0:
        kernel_regularizer = None
        bias_regularizer = None
    else:
        kernel_regularizer = tf.keras.regularizers.l1(hyperp.regularization)
        bias_regularizer = tf.keras.regularizers.l1(hyperp.regularization)
    NN = FCLayerwise(hyperp, run_options, data_input_shape, output_dimensions,
                     kernel_regularizer, bias_regularizer)

    #=== Training ===#
    optimize(hyperp, run_options, file_paths, NN, data_loss_regression,
             relative_error, parameter_and_state_obs_train,
             parameter_and_state_obs_val, parameter_and_state_obs_test,
             output_dimensions, num_batches_train)
Exemple #2
0
def trainer(hyperp, run_options, file_paths):
    #=== GPU Settings ===#
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    os.environ["CUDA_VISIBLE_DEVICES"] = run_options.which_gpu

    #=== Load Data ===#
    data_train, labels_train,\
    data_test, labels_test,\
    data_input_shape, num_channels, label_dimensions\
    = load_data(file_paths.NN_type, file_paths.dataset, run_options.random_seed)

    #=== Construct Validation Set and Batches ===#
    data_and_labels_train, data_and_labels_val, data_and_labels_test,\
    num_data_train, num_data_val, num_data_test,\
    num_batches_train, num_batches_val, num_batches_test\
    = form_train_val_test_batches(data_train, labels_train, \
                                  data_test, labels_test, \
                                  hyperp.batch_size, run_options.random_seed)

    #=== Neural network ===#
    NN = CNNLayerwise(hyperp, run_options, data_input_shape, label_dimensions,
                      num_channels, None, None)

    #=== Training ===#
    optimize_ADMM(hyperp, run_options, file_paths, NN,
                  data_loss_classification, accuracy_classification,
                  data_and_labels_train, data_and_labels_val,
                  data_and_labels_test, label_dimensions, num_batches_train)
Exemple #3
0
def trainer(hyperp, run_options, file_paths):
    #=== GPU Settings ===#
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 
    os.environ["CUDA_VISIBLE_DEVICES"] = run_options.which_gpu
    
    #=== Load Data ===#       
    data_train, labels_train,\
    data_test, labels_test,\
    data_input_shape, num_channels, label_dimensions\
    = load_data(file_paths.NN_type, file_paths.dataset, run_options.random_seed) 
    
    #=== Construct Validation Set and Batches ===# 
    data_and_labels_train, data_and_labels_val, data_and_labels_test,\
    num_data_train, num_data_val, num_data_test,\
    num_batches_train, num_batches_val, num_batches_test\
    = form_train_val_test_batches(data_train, labels_train, \
                                  data_test, labels_test, \
                                  hyperp.batch_size, run_options.random_seed)
    
    #=== Neural network ===#
    if run_options.use_L1 == 0 and run_options.use_L2 == 0:
        kernel_regularizer = None
        bias_regularizer = None  
    if run_options.use_L1 == 1:
        kernel_regularizer = tf.keras.regularizers.l1(hyperp.regularization)
        bias_regularizer = tf.keras.regularizers.l1(hyperp.regularization)
    if run_options.use_L2 == 1:
        kernel_regularizer = tf.keras.regularizers.l2(hyperp.regularization)
        bias_regularizer = tf.keras.regularizers.l2(hyperp.regularization)
    NN = CNNLayerwise(hyperp, run_options, data_input_shape, label_dimensions, num_channels,
                      kernel_regularizer, bias_regularizer)    
    
    #=== Training ===#
    optimize(hyperp, run_options, file_paths, NN, data_loss_classification, accuracy_classification, data_and_labels_train, data_and_labels_val, data_and_labels_test, label_dimensions, num_batches_train)
Exemple #4
0
def trainer(hyperp, run_options, file_paths):
    #=== GPU Settings ===# Must put this first! Because TF2 will automatically work on a GPU and it may clash with used ones if the visible device list is not yet specified
    os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
    if run_options.use_distributed_training == 0:
        os.environ["CUDA_VISIBLE_DEVICES"] = run_options.which_gpu
        GLOBAL_BATCH_SIZE = hyperp.batch_size
    if run_options.use_distributed_training == 1:
        os.environ["CUDA_VISIBLE_DEVICES"] = run_options.dist_which_gpus
        gpus = tf.config.experimental.list_physical_devices('GPU')
        GLOBAL_BATCH_SIZE = hyperp.batch_size * len(
            gpus
        )  # To avoid the core dump issue, have to do this instead of hyperp.batch_size * dist_strategy.num_replicas_in_sync

    #=== Load Data ===#
    obs_indices, parameter_train, state_obs_train,\
    parameter_test, state_obs_test,\
    data_input_shape, parameter_dimension\
    = load_thermal_fin_data(file_paths, run_options.num_data_train, run_options.num_data_test, run_options.parameter_dimensions)

    #=== Construct Validation Set and Batches ===#
    parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
    run_options.num_data_train, num_data_val, run_options.num_data_test,\
    num_batches_train, num_batches_val, num_batches_test\
    = form_train_val_test_batches(parameter_train, state_obs_train, parameter_test, state_obs_test, GLOBAL_BATCH_SIZE, run_options.random_seed)

    #=== Data and Latent Dimensions of Autoencoder ===#
    data_dimension = parameter_dimension
    if hyperp.data_type == 'full':
        latent_dimension = run_options.full_domain_dimensions
    if hyperp.data_type == 'bnd':
        latent_dimension = len(obs_indices)

    #=== Non-distributed Training ===#
    if run_options.use_distributed_training == 0:
        #=== Neural Network ===#
        NN = AutoencoderFwdInv(hyperp, data_dimension, latent_dimension)

        #=== Training ===#
        storage_array_loss_train, storage_array_loss_train_autoencoder, storage_array_loss_train_forward_problem, storage_array_loss_train_model_augmented,\
        storage_array_loss_val, storage_array_loss_val_autoencoder, storage_array_loss_val_forward_problem, storage_array_loss_val_model_augmented,\
        storage_array_loss_test, storage_array_loss_test_autoencoder, storage_array_loss_test_forward_problem, storage_array_loss_test_model_augmented,\
        storage_array_relative_error_parameter_autoencoder, storage_array_relative_error_state_obs, storage_array_relative_error_parameter_inverse_problem\
        = optimize(hyperp, run_options, file_paths, NN, obs_indices, loss_autoencoder, loss_encoder, loss_model_augmented, relative_error,\
                   parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
                   parameter_dimension, num_batches_train)

    #=== Distributed Training ===#
    if run_options.use_distributed_training == 1:
        dist_strategy = tf.distribute.MirroredStrategy()
        with dist_strategy.scope():
            #=== Neural Network ===#
            NN = AutoencoderFwdInv(hyperp, data_dimension, latent_dimension)

        #=== Training ===#
        storage_array_loss_train, storage_array_loss_train_autoencoder, storage_array_loss_train_forward_problem, storage_array_loss_train_model_augmented,\
        storage_array_loss_val, storage_array_loss_val_autoencoder, storage_array_loss_val_forward_problem, storage_array_loss_val_model_augmented,\
        storage_array_loss_test, storage_array_loss_test_autoencoder, storage_array_loss_test_forward_problem, storage_array_loss_test_model_augmented,\
        storage_array_relative_error_parameter_autoencoder, storage_array_relative_error_state_obs, storage_array_relative_error_parameter_inverse_problem\
        = optimize_distributed(dist_strategy, GLOBAL_BATCH_SIZE,
                               hyperp, run_options, file_paths, NN, obs_indices, loss_autoencoder, loss_model_augmented, relative_error,\
                               parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
                               parameter_dimension, num_batches_train)

    #=== Saving Metrics ===#
    metrics_dict = {}
    metrics_dict['loss_train'] = storage_array_loss_train
    metrics_dict[
        'loss_train_autoencoder'] = storage_array_loss_train_autoencoder
    metrics_dict[
        'loss_train_forward_problem'] = storage_array_loss_train_forward_problem
    metrics_dict[
        'loss_train_model_augmented'] = storage_array_loss_train_model_augmented
    metrics_dict['loss_val'] = storage_array_loss_val
    metrics_dict['loss_val_autoencoder'] = storage_array_loss_val_autoencoder
    metrics_dict[
        'loss_val_forward_problem'] = storage_array_loss_val_forward_problem
    metrics_dict[
        'loss_val_model_augmented'] = storage_array_loss_val_model_augmented
    metrics_dict[
        'relative_error_parameter_autoencoder'] = storage_array_relative_error_parameter_autoencoder
    metrics_dict[
        'relative_error_state_obs'] = storage_array_relative_error_state_obs
    metrics_dict[
        'relative_error_parameter_inverse_problem'] = storage_array_relative_error_parameter_inverse_problem
    df_metrics = pd.DataFrame(metrics_dict)
    df_metrics.to_csv(file_paths.NN_savefile_name + "_metrics" + '.csv',
                      index=False)
    def objective_functional(**hyperp_of_interest_objective_args_tuple):
        #=== Assign Hyperparameters of Interest ===#
        for key, val in hyperp_of_interest_objective_args_tuple.items():
            setattr(hyperp, key, val)
        hyperp.truncation_layer = int(np.ceil(hyperp.num_hidden_layers / 2))

        #=== Update File Paths with New Hyperparameters ===#
        file_paths = FilePaths(hyperp, run_options)

        #=== Construct Validation Set and Batches ===#
        if run_options.use_distributed_training == 0:
            GLOBAL_BATCH_SIZE = hyperp.batch_size
        if run_options.use_distributed_training == 1:
            GLOBAL_BATCH_SIZE = hyperp.batch_size * len(
                gpus
            )  # To avoid the core dump issue, have to do this instead of hyperp.batch_size * dist_strategy.num_replicas_in_sync
        parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
        run_options.num_data_train, num_data_val, run_options.num_data_test,\
        num_batches_train, num_batches_val, num_batches_test\
        = form_train_val_test_batches(parameter_train, state_obs_train, parameter_test, state_obs_test, GLOBAL_BATCH_SIZE, run_options.random_seed)

        #=== Non-distributed Training ===#
        if run_options.use_distributed_training == 0:
            #=== Neural Network ===#
            NN = AutoencoderFwdInv(hyperp, parameter_dimension,
                                   run_options.full_domain_dimensions,
                                   obs_indices)

            #=== Training ===#
            storage_array_loss_train, storage_array_loss_train_autoencoder, storage_array_loss_train_forward_problem,\
            storage_array_loss_val, storage_array_loss_val_autoencoder, storage_array_loss_val_forward_problem,\
            storage_array_loss_test, storage_array_loss_test_autoencoder, storage_array_loss_test_forward_problem,\
            storage_array_relative_error_parameter_autoencoder, storage_array_relative_error_parameter_inverse_problem, storage_array_relative_error_state_obs\
            = optimize(hyperp, run_options, file_paths, NN, loss_autoencoder, loss_forward_problem, relative_error,\
                       parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
                       parameter_dimension, num_batches_train)

        #=== Distributed Training ===#
        if run_options.use_distributed_training == 1:
            dist_strategy = tf.distribute.MirroredStrategy()
            GLOBAL_BATCH_SIZE = hyperp.batch_size * dist_strategy.num_replicas_in_sync
            with dist_strategy.scope():
                #=== Neural Network ===#
                NN = AutoencoderFwdInv(hyperp, parameter_dimension,
                                       run_options.full_domain_dimensions,
                                       obs_indices)

                #=== Training ===#
                storage_array_loss_train, storage_array_loss_train_autoencoder, storage_array_loss_train_forward_problem,\
                storage_array_loss_val, storage_array_loss_val_autoencoder, storage_array_loss_val_forward_problem,\
                storage_array_loss_test, storage_array_loss_test_autoencoder, storage_array_loss_test_forward_problem,\
                storage_array_relative_error_parameter_autoencoder, storage_array_relative_error_parameter_inverse_problem, storage_array_relative_error_state_obs\
                = optimize_distributed(dist_strategy, GLOBAL_BATCH_SIZE, hyperp, run_options, file_paths, NN, loss_autoencoder, loss_forward_problem, relative_error,\
                                       parameter_and_state_obs_train, parameter_and_state_obs_val, parameter_and_state_obs_test,\
                                       parameter_dimension, num_batches_train)

        #=== Saving Metrics ===#
        metrics_dict = {}
        metrics_dict['loss_train'] = storage_array_loss_train
        metrics_dict[
            'loss_train_autoencoder'] = storage_array_loss_train_autoencoder
        metrics_dict[
            'loss_train_forward_problem'] = storage_array_loss_train_forward_problem
        metrics_dict['loss_val'] = storage_array_loss_val
        metrics_dict[
            'loss_val_autoencoder'] = storage_array_loss_val_autoencoder
        metrics_dict[
            'loss_val_forward_problem'] = storage_array_loss_val_forward_problem
        metrics_dict[
            'relative_error_parameter_autoencoder'] = storage_array_relative_error_parameter_autoencoder
        metrics_dict[
            'relative_error_parameter_inverse_problem'] = storage_array_relative_error_parameter_inverse_problem
        metrics_dict[
            'relative_error_state_obs'] = storage_array_relative_error_state_obs
        df_metrics = pd.DataFrame(metrics_dict)
        df_metrics.to_csv(file_paths.NN_savefile_name + "_metrics" + '.csv',
                          index=False)

        return storage_array_loss_val[-1]