在机器迁移下有个思路为“冻结训练”,目的是把backbone冻结起来训练,加快训练效率的同时防止权值被破坏。
经过训练之后发现冻结训练里unfreeze_epoch跟freeze_epoch的概念跟我预设想的不太一样,我一开始以为启用了冻结训练那训练的迭代次数为freeze_epoch所设置的值,unfreeze_epoch的值就无关紧要了,于是乎我就减小冻结训练迭代次数大小,在我的小破机器上训练,但是跑起来才发现有问题,跑起来的总迭代次数是freeze_epoch+unfreeze_epoch得到的和,冻结训练减小“训练成本”的方法并不是减小迭代次数,而是通过在冻结训练时调用更小的显存,从而将资源放置到解冻训练中。举个例子,如果有两个筐,一个筐里装香蕉,另一个筐里装苹果,机器一开始需要学习的是区分谁是香蕉,谁是苹果,在得到较优的区分结果之后就需要去箩筐里去快速拿对应的苹果或香蕉。在实际训练中,去区分苹果和香蕉时利用冻结训练,在利用较小的计算资源得到能够区分苹果跟香蕉的能力之后,就解冻训练利用更大的计算资源去筐里拿对应的水果儿,区别就在于如果不利用冻结+解冻的话一次只能拿出一个苹果,冻结+解冻之后就有能力每次都从筐里拿出两个甚至更多的苹果了,因为计算资源已经都放在了后面拿水果的过程中。
综上所述,冻结训练的初衷其实是给算力不足或比较小的机器来服务的,所以如果机器的算力够高。换句话说你脑子跟力气都好使的情况下,一训练就知道谁是苹果谁是香蕉的前提下,去执行拿水果儿的任务过程中你一次能抱起五六个苹果甚至更多,那就不需要考虑冻结训练了。