【mmseg】ValueError: Only one of `max_epochs` or `max_iters` can be set.报错解决

目录

💜💜1背景

❤️ ❤️2分析

🔥2.1config查看

🔥2.2BaseRunner基类

💚💚3解决

🔥3.1按照epoch

🔥3.2按照iters

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


💜💜1背景

        mmseg工程修改变化检测任务时,设置config文件时,运行报错ValueError: Only one of `max_epochs` or `max_iters` can be set.

        详细报错信息如下:

fatal: Not a git repository (or any parent up to mount point /data)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Traceback (most recent call last):File "/data/XX/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/utils/registry.py", line 69, in build_from_cfgreturn obj_cls(**args)File "/data/XX/anaconda3/envs/openmmlab/lib/python3.8/site-packages/mmcv/runner/base_runner.py", line 136, in __init__raise ValueError(
ValueError: Only one of `max_epochs` or `max_iters` can be set.

        报错截图: 

❤️ ❤️2分析

🔥2.1config查看

        报错信息很明显就是说runner设置的有问题,通过打印出来的config信息看到:

 

        runner = dict(type='EpochBasedRunner', max_iters=200, max_epochs=200)

        这一句一看就不对,不能同时max_iters和max_epochs保留。

  • 如果按照epoch来训练,删除掉max_iters=200即可;
  • 如果按照inters来训练,删除掉max_epochs=200即可。

🔥2.2BaseRunner基类

        mmcv中Runner类主要有三个:BaseRunner基类,以及继承于它的EpochBasedRunner类和IterBasedRunner类,顾名思义对应着Epoch和iter两种迭代方式。其中train、val、run、save_checkpoint方法由EpochBasedRunner和IterBasedRunner实现。

        先快速看一下BaseRunner的构造函数:

  def __init__(self,model,optimizer=None,work_dir=None,logger=None,meta=None,max_iters=None,max_epochs=None):………………self.model = modelself.optimizer = optimizerself.logger = loggerself.meta = meta# create work_dirif isinstance(work_dir,str):self.work_dir = osp.abspath(work_dir)mmcv.mkdir_or_exist(self.work_dir)elif work_dir is None:self.work_dir = Noneelse:raise TypeError('"work_dir" must be a str or None')if hasattr(self.model, 'module'): # 若经DataParallel包装,则获得内部的module名self._model_name = self.model.module.__class__.__name__else:self._model_name = self.model.__class__.__name__self.timestamp = utils.get_time_str() # 获得初始化时的时间戳self.mode = Noneself._hooks = [] # 就是保存hook类的list了self._epoch = 0 # 表示经过多少次train epoch,每经过一次train_epoch加1,val_epoch不加# 特别的IterBasedRunner也用IterLoader类维护了_epoch,每遍历完一次dataloader就加1# 比如workflow为[('train':1000,'val':200)],len(traindataloader)为100,那么会将经历10个epochself._iter = 0  # 表示经过多少次train iter,每经过一次train_iter加1,val_iter不加self._inner_iter = 0# 表示一个val epoch 或者 train epoch内,iter的次数# 经过一个val_iter或者train_iter都加1,经过一个epoch后就归零if max_epochs is not None and max_iters is not None:raise ValueError('Only one of `max_epochs` or `max_iters` can be set.') # 不能同时指定self._max_epochs = max_epochs # EpochBasedRunner看max_epochs,表示_epoch的最大值,即最多训练的epoch数量# 比如max_epochs为50,workflow为[('train',2),('val',1)]。那么将经过50/2=25次workflowself._max_iters = max_iters # IterBasedRunner看max_epochsself.log_buffer = LogBuffer() # 维护了一个字典,一到end of epoch 或者 经过n个iter,就把log_buffer写入日志,将由logger_hook处理

        可以从BaseRunner的定义可以看到,如果同时指定max_iters和max_epochs,就会报错“Only one of `max_epochs` or `max_iters` can be set.”

if max_epochs is not None and max_iters is not None:raise ValueError('Only one of `max_epochs` or `max_iters` can be set.') # 不能同时指定

        因此找到了报错的源头,就能很好的解决了。跟我们发现的问题位置也是一样的,因此修改方案就是删除其中一种即可。

💚💚3解决

🔥3.1按照epoch

        修改config文件为:

runner = dict(type='EpochBasedRunner', max_epochs=200)
checkpoint_config = dict(by_epoch=True, interval=1)

        这种epoch的计算方式表示总共的迭代轮数为200,保存模型是按照epoch进行模型保存,每1个epoch计算完保存一次模型。 

        这里要注意:如果你的baserunner定义为按照epoch计算的,那么下面的checkpoint_config最好也是按照epoch进行计算,每一轮或者每几轮都是通过interval参数进行设置的。如果baserunner定义为按照iters计算,那么最好checkpoint_config也与之保持一致。方便对比。

🔥3.2按照iters

        或者修改为inters的计算方式。config代码如下:

runner = dict(type='ItersBasedRunner', max_epochs=20000)
checkpoint_config = dict(by_epoch=False, interval=2000)

        这种iters的计算方式表示总共的迭代次数为20000,保存模型是按照iters进行模型保存,每2000次迭代保存一次模型。

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/225464.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PTA NeuDS-数据库题目集

一.判断题 1.在数据库中产生数据不一致的根本原因是冗余。T 解析:数据冗余是数据库中产生数据不一致的根本原因,因为当同一数据存储在多个位置时,如果其中一个位置的数据被修改,其他位置的数据就不一致了。因此,在数据…

在Linux中对Docker中的服务设置自启动

先在Linux中安装docker,然后对docker中的服务设置自启动。 安装docker 第一步,卸载旧版本docker。 若系统中已安装旧版本docker,则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令:yum -y remove docker docker-c…

编程学习及常见的技术难题

文章目录 编程学习及常见的技术难题引言如何学习编程学习参考开发工具推荐编程中常见的技术难题 编程学习及常见的技术难题 引言 学习编程是一件有趣也有挑战的事情,它可以让你创造出各种有用的软件,解决各种复杂的问题,甚至改变世界。 编程中…

萤石云接口调用

获取appKey和secret 登录后在开发者服务-我的应用中获取 根据appKey和secret获取accessToken 参考官方文档:文档概述 萤石开放平台API文档 # 获取accessToken url_accessToken"https://open.ys7.com/api/lapp/token/get" data {"appKey": &…

大模型的开源闭源

文章目录 开源&闭源开源和闭源的优劣势比较开源和闭源对大模型技术发展的影响开源与闭源的商业模式比较国内的大模型开源和闭源的现状和趋势 开源和闭源,两种截然不同的开发模式,对于大模型的发展有着重要影响。 开源让技术共享,吸引了众…

修复debain/ Ubuntu 中的“密钥存储在旧版 trust.gpg 密钥环中”问题

如果您在 Ubuntu 22.04 及更高版本中使用 PPA 或添加外部存储库,您很可能会看到如下消息: W: https://packagecloud.io/slacktechnologies/slack/debian/dists/jessie/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg),…

Jmeter全流程性能测试实战

项目背景: 我们的平台为全国某行业监控平台,经过3轮功能测试、接口测试后,98%的问题已经关闭,决定对省平台向全国平台上传数据的接口进行性能测试。 01、测试步骤 1、编写性能测试方案 由于我是刚进入此项目组不久,…

14 网关实战:网关聚合API文档

上节课介绍了网关层的认证鉴权,今天这节介绍一下网关层如何聚合API接口文文档。 为什么需要聚合API接口文档? 大型微服务系统模块众多,木谷博客系统就有9个,如果这些服务的接口地址没有一个统一,那么客户端将要保存每个服务的接口地址,这个肯定是不现实。 先来看一下A…

ThinkPHP6学生选课管理系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6学生选课管理系统 一 介绍 此学生选课管理系统基于ThinkPHP6框架开发,数据库mysql8,前端bootstrap。系统角色分为学生,教师和管理员。学生登录后可进行选课,教师登录后可查看选课情况…

成为AI产品经理——模型评估(混淆矩阵)

一、混淆矩阵 1.混淆矩阵的介绍 混淆矩阵有两个定义positive(正例)和negative(反例)。分别代表模型结果的好和坏。 下图就是一个分类问题的混淆矩阵。横行代表真实的情况,而竖行代表预测的结果。 为了便于理解&…

华为的团队管理法

大家好,我是老原。 对于关注我很久的粉丝朋友来说,“团队”这个关键词一直在出现。 毕竟,项目经理最重要的工作就是带团队,拿结果。 那问题就来了:怎么才能管理好团队,顺利的推进项目? 之前…

关于数据中心机房防雷和接地系统的解决方案

随着通信技术、计算机网络技术的飞速发展,计算机和网络越来越深入人们生活和工作中,同时也预示着数字化、信息化时代的来临。由于微电子设备具有高密度、高速度、低电压、和低功耗等特性,极易受雷击、电磁脉冲辐射、地电位反击、电源尖波等瞬…