yolov8逐步分解(9)_训练过程之Epoch迭代过程-1. Epoch循环处理过程

        for epoch in range(self.start_epoch, self.epochs):
            self.epoch = epoch
            self.run_callbacks('on_train_epoch_start')
            self.model.train() #将模型设置为训练模式
            if RANK != -1:
                self.train_loader.sampler.set_epoch(epoch)
            pbar = enumerate(self.train_loader)
            # Update dataloader attributes (optional)
            if epoch == (self.epochs - self.args.close_mosaic): #最后10次训练关闭mosaic可以提升训练效果
                LOGGER.info('Closing dataloader mosaic')
                if hasattr(self.train_loader.dataset, 'mosaic'):
                    self.train_loader.dataset.mosaic = False
                if hasattr(self.train_loader.dataset, 'close_mosaic'):
                    self.train_loader.dataset.close_mosaic(hyp=self.args)
                self.train_loader.reset() #重置训练数据加载器的状态

            if RANK in (-1, 0):
                LOGGER.info(self.progress_string())
                pbar = tqdm(enumerate(self.train_loader), total=nb, bar_format=TQDM_BAR_FORMAT)
            self.tloss = None
            self.optimizer.zero_grad()

这段代码是模型训练循环的一部分。下面详细介绍一下它的功能:

  1. 外层循环遍历训练 epoch,从 self.start_epoch 开始,一直到 self.epochs。这确保了模型会按照指定的训练轮数进行训练。
  2. 在每个 epoch 开始时,它调用 self.run_callbacks('on_train_epoch_start') 来执行注册的回调函数。这可能会触发一些自定义的回调函数,用于在训练过程中执行特定的操作,例如记录指标、调整超参数等
  3. 它使用 self.model.train() 将模型设置为训练模式。确保模型在训练阶段正确地执行前向传播和反向传播。
  4. 如果 RANK 不等于 -1,它会将训练数据加载器的 sampler 的 epoch 设置为当前 epoch。确保在分布式训练中每个进程都能访问到正确的数据。
  5. 它通过枚举训练数据加载器创建一个进度条 (pbar),以便更好地监控训练过程,关于进度条的详细介绍可以参考文章python之tqdm函数使用总结
  6. 如果当前 epoch 是最后 self.args.close_mosaic 个 epoch,它会禁用训练数据集中的"mosaic"数据增强技术,并重置训练数据加载器的状态。这是为了在训练的最后阶段提高模型的泛化性能
  7. 如果 RANK 是 -1 或 0(即主进程),它会记录进度字符串并创建一个 tqdm 进度条。
  8. 将 self.tloss 设置为 None,并将优化器的梯度重置为零。

     这段代码负责设置训练循环,管理训练数据集,并为下一个训练步骤准备模型和优化器。

上一篇:YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)


下一篇:Python爬虫实战:从入门到精通