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