From c0fbebe1b4b95c0988fdbe874d1f48706a743040 Mon Sep 17 00:00:00 2001 From: Tim O'Donnell <timodonnell@gmail.com> Date: Tue, 28 Nov 2017 14:26:09 -0500 Subject: [PATCH] Clearer output during training --- .../class1_affinity_predictor.py | 26 ++++++++++++++----- .../class1_neural_network.py | 19 +++++++++----- .../train_allele_specific_models_command.py | 18 ++++++++----- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py b/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py index fa0623fb..d1e0f02c 100644 --- a/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py +++ b/mhcflurry/class1_affinity_prediction/class1_affinity_predictor.py @@ -370,7 +370,8 @@ class Class1AffinityPredictor(object): peptides, affinities, models_dir_for_save=None, - verbose=1): + verbose=1, + progress_preamble=""): """ Fit one or more allele specific predictors for a single allele using a single neural network architecture. @@ -399,6 +400,9 @@ class Class1AffinityPredictor(object): verbose : int Keras verbosity + progress_preamble : string + Optional string of information to include in each progress update + Returns ------- list of Class1NeuralNetwork @@ -411,7 +415,8 @@ class Class1AffinityPredictor(object): peptides=peptides, affinities=affinities, allele_pseudosequences=None, - verbose=verbose) + verbose=verbose, + progress_preamble=progress_preamble) if allele not in self.allele_to_allele_specific_models: self.allele_to_allele_specific_models[allele] = [] @@ -442,7 +447,8 @@ class Class1AffinityPredictor(object): peptides, affinities, models_dir_for_save=None, - verbose=1): + verbose=1, + progress_preamble=""): """ Fit one or more pan-allele predictors using a single neural network architecture. @@ -472,6 +478,9 @@ class Class1AffinityPredictor(object): verbose : int Keras verbosity + progress_preamble : string + Optional string of information to include in each progress update + Returns ------- list of Class1NeuralNetwork @@ -486,7 +495,8 @@ class Class1AffinityPredictor(object): peptides=peptides, affinities=affinities, allele_pseudosequences=allele_pseudosequences, - verbose=verbose) + verbose=verbose, + progress_preamble=progress_preamble) for (i, model) in enumerate(models): model_name = self.model_name("pan-class1", i) @@ -511,7 +521,8 @@ class Class1AffinityPredictor(object): peptides, affinities, allele_pseudosequences, - verbose=1): + verbose=1, + progress_preamble = ""): """ Private helper method @@ -523,6 +534,8 @@ class Class1AffinityPredictor(object): affinities : list of float allele_pseudosequences : EncodableSequences or list of string verbose : int + progress_preamble : string + Optional string of information to include in each progress update Returns ------- @@ -536,7 +549,8 @@ class Class1AffinityPredictor(object): encodable_peptides, affinities, allele_pseudosequences=allele_pseudosequences, - verbose=verbose) + verbose=verbose, + progress_preamble=progress_preamble) yield model def calibrate_percentile_ranks( diff --git a/mhcflurry/class1_affinity_prediction/class1_neural_network.py b/mhcflurry/class1_affinity_prediction/class1_neural_network.py index 995a629f..48e7d75d 100644 --- a/mhcflurry/class1_affinity_prediction/class1_neural_network.py +++ b/mhcflurry/class1_affinity_prediction/class1_neural_network.py @@ -317,7 +317,8 @@ class Class1NeuralNetwork(object): affinities, allele_pseudosequences=None, sample_weights=None, - verbose=1): + verbose=1, + progress_preamble=""): """ Fit the neural network. @@ -338,6 +339,9 @@ class Class1NeuralNetwork(object): verbose : int Keras verbosity level + + progress_preamble : string + Optional string of information to include in each progress update """ self.fit_num_points = len(peptides) @@ -453,11 +457,14 @@ class Class1NeuralNetwork(object): self.loss_history[key].extend(value) print( - "Epoch %3d / %3d: loss=%g. Min val loss at epoch %s" % ( - i, - self.hyperparameters['max_epochs'], - self.loss_history['loss'][-1], - min_val_loss_iteration)) + ( + progress_preamble + " " + + "Epoch %3d / %3d: loss=%g. Min val loss (%s) at epoch %s" % ( + i, + self.hyperparameters['max_epochs'], + self.loss_history['loss'][-1], + str(min_val_loss), + min_val_loss_iteration)).strip()) if self.hyperparameters['validation_split']: val_loss = self.loss_history['val_loss'][-1] diff --git a/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py b/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py index f71147e0..cc9f82a6 100644 --- a/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py +++ b/mhcflurry/class1_affinity_prediction/train_allele_specific_models_command.py @@ -79,7 +79,7 @@ parser.add_argument( "--verbosity", type=int, help="Keras verbosity. Default: %(default)s", - default=1) + default=0) parser.add_argument( "--parallelization-num-jobs", default=1, @@ -172,6 +172,7 @@ def run(argv=sys.argv[1:]): 'allele': allele, 'sub_df': sub_df, 'hyperparameters': hyperparameters, + 'verbose': args.verbosity, 'predictor': predictor if not worker_pool else None, 'save_to': args.out_models_dir if not worker_pool else None, } @@ -220,22 +221,23 @@ def process_work( allele, sub_df, hyperparameters, + verbose, predictor, save_to): if predictor is None: predictor = Class1AffinityPredictor() - print( + progress_preamble = ( "[%2d / %2d hyperparameters] " - "[%2d / %2d replicates] " - "[%4d / %4d alleles]: %s" % ( + "[%4d / %4d alleles] " + "[%2d / %2d replicates]: %s " % ( hyperparameter_set_num + 1, num_hyperparameter_sets, - model_group + 1, - n_models, allele_num + 1, n_alleles, + model_group + 1, + n_models, allele)) train_data = sub_df.dropna().sample(frac=1.0) @@ -245,7 +247,9 @@ def process_work( allele=allele, peptides=train_data.peptide.values, affinities=train_data.measurement_value.values, - models_dir_for_save=save_to) + models_dir_for_save=save_to, + progress_preamble=progress_preamble, + verbose=verbose) return predictor -- GitLab