増分学習で知識の蒸留を経験しています。基本的に、各フェーズで新しいモデルを初期化し、現在のデータで学生モデルとしてトレーニングし、古いモデル (前のフェーズでトレーニングされたもの) を教師として使用します。これまでのところ、コードにエラーはありませんが、問題は、各フェーズの後に損失が減少しないことです。また、 PL で on_train_epoch_start で新しいオプティマイザを初期化する方法はありますか?
def on_train_epoch_start(self) :
if self.new_phase:
self.old_backbone = copy.deepcopy(self.backbone)
self.old_head = copy.deepcopy(self.head)
self.backbone = None
self.head = None
for p in self.old_backbone.parameters():
p.requires_grad = False
for p in self.old_head.parameters():
p.requires_grad = False
self.backbone = create_backbone(model_name=self.params.backbone_name,
**self.params.backbone_params)
# create LINEAR head
self.params.head_params['in_features'] = self.backbone.num_features
self.head = HEADS.get(self.params.head_name)(**self.params.head_params)
self.backbone = self.backbone.to(self.device)
self.head = self.head.to(self.device)
self.old_backbone.eval()
self.old_head.eval()
self.backbone.train()
self.head.train()