@@ -367,11 +367,13 @@ def _output_summary(self) -> None:
367367 else :
368368 # print to logger
369369 print_fn = lambda x : logger .verbose ("%s" , x ) #type:ignore[attr-defined] # noqa[E731] # pylint:disable=C3001
370+ parent = None
370371 for idx , model in enumerate (get_all_sub_models (self .model )):
371372 if idx == 0 :
372373 parent = model
373374 continue
374375 model .summary (line_length = 100 , print_fn = print_fn )
376+ assert parent is not None
375377 parent .summary (line_length = 100 , print_fn = print_fn )
376378
377379 def _compile_model (self ) -> None :
@@ -453,6 +455,7 @@ def __init__(self,
453455 self ._name = model_name
454456 self ._iterations = 0
455457 self ._mixed_precision_layers : list [str ] = []
458+ self ._lr_finder = - 1.0
456459 self ._rebuild_model = False
457460 self ._sessions : dict [int , dict ] = {}
458461 self ._lowest_avg_loss : dict [str , float ] = {}
@@ -503,6 +506,11 @@ def mixed_precision_layers(self) -> list[str]:
503506 """list: Layers that can be switched between mixed-float16 and float32. """
504507 return self ._mixed_precision_layers
505508
509+ @property
510+ def lr_finder (self ) -> float :
511+ """ The value discovered from the learning rate finder. -1 if no value stored """
512+ return self ._lr_finder
513+
506514 @property
507515 def model_needs_rebuild (self ) -> bool :
508516 """bool: ``True`` if mixed precision policy has changed so model needs to be rebuilt
@@ -595,6 +603,17 @@ def add_mixed_precision_layers(self, layers: list[str]) -> None:
595603 logger .debug ("Storing mixed precision layers: %s" , layers )
596604 self ._mixed_precision_layers = layers
597605
606+ def add_lr_finder (self , learning_rate : float ) -> None :
607+ """ Add the optimal discovered learning rate from the learning rate finder
608+
609+ Parameters
610+ ----------
611+ learning_rate : float
612+ The discovered learning rate
613+ """
614+ logger .debug ("Storing learning rate from LR Finder: %s" , learning_rate )
615+ self ._lr_finder = learning_rate
616+
598617 def _load (self , config_changeable_items : dict ) -> None :
599618 """ Load a state file and set the serialized values to the class instance.
600619
@@ -616,6 +635,7 @@ def _load(self, config_changeable_items: dict) -> None:
616635 self ._lowest_avg_loss = state .get ("lowest_avg_loss" , {})
617636 self ._iterations = state .get ("iterations" , 0 )
618637 self ._mixed_precision_layers = state .get ("mixed_precision_layers" , [])
638+ self ._lr_finder = state .get ("lr_finder" , - 1.0 )
619639 self ._config = state .get ("config" , {})
620640 logger .debug ("Loaded state: %s" , state )
621641 self ._replace_config (config_changeable_items )
@@ -624,10 +644,12 @@ def save(self) -> None:
624644 """ Save the state values to the serialized state file. """
625645 logger .debug ("Saving State" )
626646 state = {"name" : self ._name ,
627- "sessions" : self ._sessions ,
647+ "sessions" : {k : v for k , v in self ._sessions .items ()
648+ if v .get ("iterations" , 0 ) > 0 },
628649 "lowest_avg_loss" : self ._lowest_avg_loss ,
629650 "iterations" : self ._iterations ,
630651 "mixed_precision_layers" : self ._mixed_precision_layers ,
652+ "lr_finder" : self ._lr_finder ,
631653 "config" : _CONFIG }
632654 self ._serializer .save (self ._filename , state )
633655 logger .debug ("Saved State" )
0 commit comments