mmdetection框架的问题需求追踪源码之训练验证

问题:
mmdetection框架的问题需求追踪源码之训练验证_第1张图片
上图是使用mmdetection几乎默认配置的训练输出,当时我是以为这个输出是验证集的验证输出,但是在实验和看别人的配置的时候,在各个网络的配置里面不用改val和test也能训练自己的训练集,看别人的甚至直接删掉这两项也可以训练。所以问题就是既然验证的配置删掉也能训练,那说明了上面的训练输出不是验证集验证的,真的是全部都是训练数值输出吗?为了找到答案就需要查看源码,看看在训练的过程中具体是怎么操作的。
第一步先进到我们训练用的tools/trin.py里面看mmdetection框架的问题需求追踪源码之训练验证_第2张图片
我们看到了主函数里面最后调用了train_detector函数,把模型,数据,配置全都丢了进去,我们跟进这个函数,路径在mmdet/apis/train.py
mmdetection框架的问题需求追踪源码之训练验证_第3张图片
这个模块就这么多,选择是不是分布训练,默认为False,进入_non_dist_train函数,这个函数位置在同一个文件的下面。
mmdetection框架的问题需求追踪源码之训练验证_第4张图片
在这个函数里面,先是前面的一堆训练的配置,最后执行了这个run函数来开始训练模型,感觉已经接近答案了,我们进入run看一下,run是Runner类的函数,我们就要找到Runner类定义的文件
在这里插入图片描述
这能知道Runner类是在mmcv.runner包里面的,mmcv也是商汤和mmdetection一起开源的一个库,可以clone下来也可以直接在github上看,https://github.com/open-mmlab/mmcv我就直接在github上看了。
在这里插入图片描述
mmdetection框架的问题需求追踪源码之训练验证_第5张图片
成功找到Runner类,往下拉找到run函数,首先我们看到run函数先定位训练的那部分在哪里,就是while块里面。再根据run的接收参数和输入的参数知道,训练用到了三个参数,第一个是遍历epoch用的max_epochs,第二个是workflow,最后把dataloader输入进去训练。
mmdetection框架的问题需求追踪源码之训练验证_第6张图片
分析while块,每个epoch都遍历workfile,workflow的格式看参数注释,根据从workfile的值来选择使用以下哪个函数,是训练还是验证。所以到这里我们的答案已经出来了,我的workflow是默认的配置就是这个,可见我只有train,所以训练输出的数值都是训练集中的训练数值,根本没有验证。后面的数字用例子解释比较好,用参数注释的配置来做例子,workflow = [(‘train’, 2), (‘val’, 1)],就表示了训练2个epoch验证1次。

workflow = [('train', 1)]

mmdetection框架的问题需求追踪源码之训练验证_第7张图片
mmdetection框架的问题需求追踪源码之训练验证_第8张图片
结果:训练模型时的训练和验证可以从配置的workflow中配,我的配置是默认配置只有train没有用val就没有验证。

你可能感兴趣的:(mmdetection框架的问题需求追踪源码之训练验证)