迁移学习(微调Torchvision模型)
两种类型:微调和特征提取
微调:从与训练模型开始,更新新任务的所有模型参数,实质上是重新训练整个模型。
特征提取:从预训练模型开始,仅更新从中导出预测的最终图层权重。使用预训练的CNN作为固定的特征提取器,并且仅改变输出层。
这两种迁移学习方法都遵循如下步骤:
- 初始化与训练模型
- 重组最后一层,使其具有与新数据集类别数相同的输出数
- 为优化算法定义想要在训练期间更新的参数
- 运行训练步骤
辅助函数
1. 模型训练和验证代码(可作为参考)
train_model函数处理给定模型的训练和验证。作为输入,它需要PyTorch模型、数据加载器字典、损失函数、优化器、用于训练和验 证epoch数,以及当模型是初始模型时的布尔标志。跟踪最佳性能的模型(从验证准确率方面),并在训练结束时返回性能最好的模型。
def train_model(model, dataloaders, criterion, optimizer, num_epochs=25, is_inception=False):
since = time.time()
val_acc_history = []
best_model_wts = copy.deepcopy(model.state_dict())
best_acc = 0.0
for epoch in range(num_epochs):
print('Epoch {}/{}'.format(epoch, num_epochs - 1))
print('-' * 10)
# 每个epoch都有一个训练和验证阶段
for phase in ['train', 'val']:
if phase == 'train':
model.train() # Set model to training mode
else:
model.eval() # Set model to evaluate mode
running_loss = 0.0
running_corrects = 0
# 迭代数据
for inputs, labels in dataloaders[phase]:
inputs = inputs.to(device)
labels = labels.to(