code: def train_one_epoch(model, optimizer, data_loader, device, epoch):
      model.train()
      loss_function = torch.nn.CrossEntropyLoss()
      mean_loss = torch.zeros(1).to(device)
      optimizer.zero_grad()
  
      data_loader = tqdm(data_loader, file=sys.stdout)
      for step, data in enumerate(data_loader):
          images, labels = data
          pred = model(images.to(device))
  
          loss = loss_function(pred, labels.to(device))
          loss.backward()
          mean_loss = (mean_loss * step + loss.detach()) / (
              step + 1
          )  # update mean losses
  
          # 打印平均loss
          data_loader.desc = "[epoch {}] mean loss {}".format(
              epoch, round(mean_loss.item(), 3)
          )
  
          if not torch.isfinite(loss):
              print("WARNING: non-finite loss, ending training ", loss)
              sys.exit(1)
  
          optimizer.step()
          optimizer.zero_grad()
  
      return mean_loss.item()
  
imports: import sys
  from tqdm import tqdm
  import torch
label_desc: Use image node_id 1 for calling a global function with example usage: train_one_epoch(model, optimizer, data_loader, device, epoch) and returns: mean_loss