code: def run(self, epochs):
          
          best_loss = sys.maxsize
          for epoch in trange(epochs):
              iter_no = 0
  
              ## train
              sum_losses, len_losses = self.train_batch(self.train_dataloader)
  
              if iter_no % 20 == 0:
                  current_loss = sum_losses / len_losses
                  print("[Train] epoch:{e} iter:{i} loss:{l:.4f}".format(e=epoch,
                                                                         i=iter_no,
                                                                         l=current_loss))
  
              ## validating
              sum_val_losses, len_val_losses = self.infer_batch(self.valid_dataloader)
  
              current_val_loss = sum_val_losses / len_val_losses
              print("[Vaild] epoch:{e} iter:{i} loss:{l:.4f}".format(e=epoch,
                                                                     i=iter_no,
                                                                     l=current_val_loss))
  
              if best_loss > current_val_loss:
                  self.save_model(epoch, current_val_loss)
                  best_loss = current_val_loss
  
              iter_no += 1
docs: Description : Run training for LipNet