Fine Tuning
@Langs: python, torch @reference: d2l-pytorch,transfer_torch This Note focus on the code part. 模型微调和模型预训练,在Pytorch中的使用方式对比汇总。 How to Design the Fine Tune 这一部分主要集中于我们对于微调任务的拆解,有几种不同的预训练和微调的方式,在不同的情景下,对应的参数应该怎么设置和调整是问题的重点。 基于这种Transfer的策略,我们能够学习到一个更通用,泛化能力更强,有助于识别边缘,色彩,等等有助于下游任务的通用特征提取。 在Transfer任务中,有几种不同的调整方式: 固定Bakcbone,只训练Classifier 同步微调网络 区分学习率,微调Backbone,训练Classifirer 为了实现这几种不同的Transfer方式,需要用到以下的几种方式:梯度截断,lr区分设置等。 Code Part 不同lr设置 微调Backbone,训练Classifier作为最经典的Transfer设定,在Code上也较为复杂,所以我们首先举个这种例子。 相关的文档可以参考:torch.optim python # get dataset train_img = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train')) # get new model pretrained_new = model.expand_dim(dim=out_dim,re_init=True) # pre train it 定义一个用于微调的函数 # pytorch可以通过字典的形式来区分对设置lr def train_fine_tuning(net, learning_rate, batch_size=128, num_epoch=5, diff_lr=True): # set dataloader train_iter = torch.utils.Dataloader(train_img, batch_size=batch_size, shuffle=True) test_iter = ... # set loss loss = nn.CrossEntropyLoss(reduction='none') # set diff lr for diff part of it if diff_lr: params_1x = [param for name, param in net.name_parameters() if name not in ["fc.weight", "fc.bias"]] trainer = torch.optim.SGD([{'params': params_1x}, {'params': net.fc.parameters(), 'lr': learning_rate *10}], lr=learning_rate, weight_decay=0.001 ) else: trainer = torch.optim.SGD(net.parameters(), lr=learning_rate, weight_decay=0.001) 同时不用担心,scheduler可以将我们的两组lr同时进行更新,可以基于下面的代码进行测试 ...