我正在尝试使用PyTorch进行转学。我想先训练fc层,然后再微调整个网络。不幸的是,在对fc层进行了培训之后,再经过我的网络进行微调,我失去了在第一次培训中获得的准确性。这是预期的行为还是我在这里做错了什么?
代码如下:
model = torchvision.models.resnet50(pretrained=True)
for param in model.parameters():
param.requires_grad = False
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 4)
model = model.to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
model = trainer.fit_model(dataloader, model, criterion, optimizer, num_epochs=10)
# fit model is basic PyTorch training function found here: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html#convnet-as-fixed-feature-extractor The only difference is that scheduler is an optional param.
for param in model.parameters():
param.requires_grad = True
torch.cuda.empty_cache()
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
# Here I am finetuning the model
model_ft = trainer.fit_model(
dataloader, model, criterion, optimizer, scheduler=exp_lr_scheduler, num_epochs=10
)
我在这里错过了什么吗?还是应该只训练一次模型?
答案 0 :(得分:2)
这是进行转移学习时可能发生的事情 灾难性的遗忘。基本上,您过多地更新了预训练的权重,而您“忘记”了以前学到的东西。如果您的学习率太高,则可能会发生这种情况。我建议首先尝试降低学习率,或使用可区分的学习率(网络头和受过训练的部分的学习率不同,这样您在fc层上的学习率将高于其余部分。网络)。