MMEditing代码阅读笔记三:main()函数中的train_model()

MMEditing代码阅读笔记三:main()函数中的train_model()

main()函数中最后一部分train_model()函数的学习记录,学习的过程中至现在还有几点疑惑,但是查找资料也没有相关记载。所以,现在把自己的学习记录写下来,也希望有大佬可以指点指点疑点。

记录点

在学习该部分的过程中,有几个触动的点:
1、call_hook_方法重写:该方法我大白话理解就是一个程序中断了一个正在运行的程序,等中断程序运行完毕后,返回刚才正在执行的程序。

2、Runner分为EpochBasedRunner和IterBasedRunner,顾名思义,前者以epoch的方式管理流程,后者以iter的方式管理流程,它们都是BaseRunner的子类。EpochBasedRunner和IterBasedRunner本身没有重写构造函数,直接继承了BaseRunner的构造函数。(因为自己见的少吧,刚开始一直有个疑问,这个epoch到底是多少阿?以往都是训练基于epoch,mmediting源码中给出的是基于迭代次数的。但感觉还是有点别扭,但人家还是这样做了,才疏学浅阿。)

3、run()是Runner类的主调函数,会根据workflow指定的工作流,对data_loaders中的数据进行处理。目前MMCV支持训练和验证两种工作流,对于EpochBasedRunner而言,workflow配置为[(‘train’, 2),(‘val’, 1)]表示先训练2个epoch,然后验证一个epoch;[(‘train’, 1)]表示只进行训练,不进行验证。如果是IterBasedRunner,[(‘train’, 2),(‘val’, 1)]则表示先训练2个iter,然后验证一个iter。然后getattr(self, mode)会根据不同mode调用self.train()函数和self.val()函数。

train_model()执行流程

MMEditing实现一个算法包含四个步骤:
第一、第二步注册数据集和模型的目的是构建基础模块(数据流和模型)
第三步构建配置文件的目的是指定需要的模块以及模块的输入参数
第四步就是根据配置文件把事先定义好的模块一个个拎出来,传入指定的输入参数,然后按照算法流程依次串起来。

先看下图,本记录仅仅记录了train的过程执行走向。
MMEditing代码阅读笔记三:main()函数中的train_model()_第1张图片train()和val()的核心函数是train_step(),根据iter_runner = getattr(self, mode)参数调用train()或val(),这两个函数最终都会指向我们自己模型的forward()函数,返回模型的前向推理结果(一般是Loss值)。
以超分模型EDSR为例。
Runner到我们自己的模型中间还会经过MMDataParallel、BasicRestorer、 EDSR类,最终调用我们自己模型的forward()函数,执行推理过程。

疑惑点

1、BasicRestorer类中存在三个函数。
如下图,虽然正常执行走向如上图,但是从代码来看 是从:iter_based_runner.py中的 outputs = self.model.train_step(data_batch, self.optimizer, **kwargs)进入的是BasicRestorer的train_step()函数后 就没有再进入其他两个函数。
但是正常来说,不应该先执行train_step()函数-》forward()->forward_train()函数再返回吗?调式走到这一步之前就崩住不动了。多以很是疑惑。
MMEditing代码阅读笔记三:main()函数中的train_model()_第2张图片
MMEditing代码阅读笔记三:main()函数中的train_model()_第3张图片MMEditing代码阅读笔记三:main()函数中的train_model()_第4张图片

今日学习记录因存在疑惑点而不完整,希望有大佬有兴趣的哈,可以指教一下!

你可能感兴趣的:(MMEditing,人工智能,算法,机器学习,超分辨率重建,深度学习)