                      'epoch_no' : self._epoch_no
                       })
                  fp.write(state_json.encode('utf-8'))
          except IOError as e:
              print(e.strerror)                   
          
          print('\nsaving model weights', end='', flush=True)        
          
          from concurrent.futures import ThreadPoolExecutor, as_completed        
          
          with ThreadPoolExecutor(max_workers=4) as executor:
              futures = [executor.submit(getattr(self, mdl_name.rstrip('H5')).save_weights, str(self.model_dir / mdl_H5_fn)) for mdl_name, mdl_H5_fn in hdf.items()]
              for future in as_completed(futures):
                  future.result()
                  print('.', end='', flush=True)  
 
</s> remove                 print('.', end='', flush=True)  
 </s> add                 print('.', end='', flush=True)

        logger.info('done')
 </s> remove         print('done', flush=True)              
    
                           
 </s> add  </s> remove             print(e.strerror)                   
 </s> add             logger.error(e.strerror)
 </s> remove             print('Error loading training info:', e.strerror)
 </s> add             logger.warning('Error loading training info: %s', str(e.strerror))
 </s> remove             print('Error loading training info:', e.strerror)
 </s> add             logger.warning('Error loading training info: %s', str(e.strerror))
            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

                      'epoch_no' : self._epoch_no
                       })
                  fp.write(state_json.encode('utf-8'))
          except IOError as e:
            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

            logger.error(e.strerror)

        logger.info('saving model weights')

        from concurrent.futures import ThreadPoolExecutor, as_completed

          with ThreadPoolExecutor(max_workers=4) as executor:
              futures = [executor.submit(getattr(self, mdl_name.rstrip('H5')).save_weights, str(self.model_dir / mdl_H5_fn)) for mdl_name, mdl_H5_fn in hdf.items()]
              for future in as_completed(futures):
                  future.result()
                  print('.', end='', flush=True)  
keep keep keep keep replace replace replace replace replace replace keep keep keep keep keep
 Logging (#541)

* Convert prints to logger. Further logging improvements. Tidy  up

* Fix system verbosity. Allow SystemExit

* Fix reload extract bug

* Child Traceback handling

* Safer shutdown procedure

* Add shutdown event to queue manager

* landmarks_as_xy > property. GUI notes + linting. Aligner bugfix

* fix FaceFilter. Enable nFilter when no Filter is supplied

* Fix blurry face filter

* Continue on IO error. Better error handling

* Explicitly print stack trace tocrash log

* Windows Multiprocessing bugfix

* Add git info and conda version to crash log

* Windows/Anaconda mp bugfix

* Logging fixes for training 
plugins/model/Model_OriginalHighRes/Model.py