中断以后重新训练
有个resume的参数,将default从False改成True,然后他就会自己去找最新的权重继续训练了。
然后有个需要注意的点就是,不要为了想要备份最新的权重,然后把它复制一份出来,这样子,好像会造成路径的错乱,然后报错了很久哈哈哈(最后把复制出来的weights的文件夹删掉才好的)
增加训练的epochs
就是训练完了以后发现还没有收敛,想要继续增加epochs。我做的改动
- 修改resume参数
- 把epochs的参数修改成你需要的次数
- 在train文件夹里面加入语句,ckpt[‘epoch’] = 上一次训练的最后一个的次数
如果没有改的话可能会报错,大概的意思是说已经训练完了,不需要再继续训练了。 - 我还改了/runs/exp3中的opt.yaml文件中的epochs的个数,修改成了300,但是不知道这个有没有用处
训练的结果
tensorboard的使用
- 先在对应的环境下安装这个库
- 然后输入tensorboard --logdir=【event文件所在的文件夹路径】
- 然后在对应的端口打开
- 如果打开网页以后没有响应,或者找不到网页的话,那么就需要在xshell中把对应的端口弄到本地服务器上面。
- 然后再打开就好了
- 最后我的训练结果如上,虽然loss会突然增加,但是最后的趋势好像也和之前是一致的,初步判断,这样子增加训练的epochs是可行的。【其实是不可行的(这种操作不可行是从ultralytics的issue中看见的),从图像中可以看见,重新训练以后,他的loss会突然增加,导致曲线有很大的变化,是因为之前训练过程中的一些学习率和设定都已经重新初始化了,虽然后续还是能够继续下降,但是和使用最后这个权重再进行微调是差不多的结果了【个人感觉】】
- 所以,如果不确定该训练几个epoch的时候,最好的情况就是尽可能的多设置一些,然后看着tensorboard进行分析,如果觉得够了,直接中断就行,虽然会缺少最后的val的部分结果,但是可以直接使用最好的结果/或者最后的权重,在val.py中获取得到对应的val结果。
冻结层
主要是对应一个freeze参数,这个参数默认是0,也就是不冻结的意思
对应的freeze的层数的代码主要是上面那样子的
freeze是一个列表,如果列表的长度大于1的话,那么freeze就是对应列表里面的数字的层数
例如输入的freeze为[0,9],那么对应的freeze=['model.0,model.9] 两层
如果输入的列表里面只有一个数字的话,那么对应的就是range(freeze[0])的层,如果输入的是10的话,那么对应的就是前10层['model.0, …, model.9] ,如果是默认输入的0的话,对应的freeze=[],没有需要冻结的层
那么对应的,可以考虑先冻结一部分层,再在这个基础上对后面的层进行修改的话,应该可以结合上面说到的几种方法进行测试?