关于DETREX从指定epoch继续训练的问题

detrex项目地址
是一个包含多种detection transformer模型的框架。
该框架支持断点续传,重新训练,但只能从最后一个iter的模型加载并训练。
例如我总共需要训练59999个iter,已经训练29999个iter,程序中断,最后一个模型的保存路径是

'../output/029999.pth'

但我想从24999这个模型,即

'../output/024999.pth'

继续训练。

需要修改三个地方。
1.训练config文件
将代码中的

train.init_checkpoint = "detectron2://ImageNetPretrained/torchvision/R-50.pkl"

修改为

train.init_checkpoint = '../output/024999.pth'
train.init_iter=24999

这里是自己想要开始训练的模型路径及对应的iter。

2.tools/train_net.py

搜索模型加载部分代码

    if args.resume and checkpointer.has_checkpoint():
        # The checkpoint stores the training iteration that just finished, thus we start
        # at the next iteration
        start_iter = trainer.iter + 1
    else:
        start_iter = 0

将之改为

    if args.resume and checkpointer.has_checkpoint():
        # The checkpoint stores the training iteration that just finished, thus we start
        # at the next iteration
        start_iter = trainer.iter + 1
    elif args.resume and cfg.train.init_iter:
        start_iter = int(cfg.train.init_iter) + 1
    else:
        start_iter = 0

3.detrex/lib/python3.9/site-packages/fvcore/common/checkpoint.py

这一步最为关键,需要找到detrex安装环境中的python包,修改模型加载部分。可以从train_net.py的*checkpointer.resume_or_load(cfg.train.init_checkpoint, resume=args.resume)*这一函数直接跳转过去。
将checkpoint.py中的resume_or_load函数找到,并将

        if resume and self.has_checkpoint():
            path = self.get_checkpoint_file()
            return self.load(path)
        else:
            return self.load(path, checkpointables=[])

修改为

        if resume and self.has_checkpoint():
            path = self.get_checkpoint_file()
            return self.load(path)
        elif resume and self.path_manager.exists(path):
            return self.load(path)
        else:
            return self.load(path, checkpointables=[])

搞定。
剩下的按照说明照常运行即可。
在这里插入图片描述

### 继续训练模型的Epoch 在机器学习实践中,继续训练模型的epoch意味着恢复之前停止的地方并进一步优化模型参数。这通常涉及保存和加载模型的状态以及优化器的信息。 对于大多数深度学习框架而言,如PyTorch或TensorFlow/Keras,在暂停训练时会存储整个模型状态字典(包括权重和其他变量),以便后续能够从中断处重新启动训练过程[^1]。具体来说: - **保存检查点**:当首次训练结束时,应该保存当前的最佳模型及其对应的optimizer状态。这样做的好处是可以记录下最后一次成功的更新位置。 - **加载检查点**:为了继续之前的训练工作,需要读取先前保存下来的文件,并将其应用于新的训练循环之中。此时要注意设置相同的随机种子以确保可重复性。 以下是利用Python库`torch`的一个简单例子展示如何实现上述功能: ```python import torch from torchvision import models, datasets, transforms from torch.utils.data import DataLoader # 假设已经完成了一部分训练... model = models.resnet50(pretrained=True) # 定义损失函数与优化方法 criterion = ... optimizer = ... # 训练若干轮次后中断程序前记得保存进度 checkpoint_path = 'checkpoint.pth' torch.save({ 'epoch': epoch, 'model_state_dict': model.state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': loss, }, checkpoint_path) # 当准备再次开始训练的时候可以从这里载入上次的数据 def load_checkpoint(checkpoint_file, model, optimizer=None): checkpoint = torch.load(checkpoint_file) start_epoch = checkpoint['epoch'] + 1 model.load_state_dict(checkpoint['model_state_dict']) if optimizer is not None: optimizer.load_state_dict(checkpoint['optimizer_state_dict']) return start_epoch start_epoch = load_checkpoint(checkpoint_path, model, optimizer=optimizer) for epoch in range(start_epoch, num_epochs): # 使用新起始epoch数迭代剩余epochs train(model, criterion, optimizer, dataloader_train) ``` 此代码片段展示了如何保存和恢复带有特定epoch计数值的训练状态。通过这种方式,可以有效地延续之前的训练成果而不必每次都从零开始[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值