赞
踩
Fine tuning和Pretrained都是深度学习中常用的概念。
Pretrained指的是在一个大型数据集上预先训练好的模型,例如ImageNet数据集上的ResNet、VGG等模型都可以视为Pretrained模型。这些模型已经经过了大量的训练和调整,并且在许多不同的图像识别任务中表现出色。因此,我们可以使用这些训练好的模型来加速我们的训练和提高我们的准确性。
Fine tuning指的是在预先训练好的模型的基础上,将整个模型或部分模型进行微调。这种方法通常用于将预训练模型应用于新任务时,因为新任务的数据集与原始数据集不完全相同,需要对模型进行一定的调整。 Fine tuning可以通过调整训练过程中的各种参数来完成,包括缩小学习率,使用更小的批次大小,更多的迭代次数,以及使用正则化技术等。这可以帮助我们避免过拟合和提高模型的性能。
区别:
技巧:
在前面的介绍卷积神经网络的时候,说到过PyTorch已经为我们训练好了一些经典的网络模型,那么这些预训练好的模型是用来做什么的呢?其实就是为了我们进行微调使用的。
https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter04_advanced/4_1_fine-tuning/
fine-tune注意事项:
与fine-tune类似,使用整个pre-trained的model作为初始化,然后fine-tuning整个网络而不是某些层,但是这个的计算量是非常大的,就只相当于做了一个初始化。
在微调期间,我们需要冻结预训练模型的所有层,并仅训练新添加的输出层。代码示例:
import torch import torch.nn as nn import torchvision.models as models # 加载预训练模型 model = models.resnet18(pretrained=True) # 冻结模型的前几层, 若为Pretrained则不需要冻结权重的这步 for param in model.parameters(): param.requires_grad = False for param in model.layer4.parameters(): param.requires_grad = True # 更改最后一层的输出 num_ftrs = model.fc.in_features model.fc = nn.Linear(num_ftrs, 2) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.001) # 训练模型 train_loader = ... for epoch in range(num_epochs): for i, (images, labels) in enumerate(train_loader): # 前向传递 outputs = model(images) loss = criterion(outputs, labels) # 反向传播和优化器 optimizer.zero_grad() loss.backward() optimizer.step() # 显示损失和精度 if (i+1) % 100 == 0: print("Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}" .format(epoch+1, num_epochs, i+1, total_step, loss.item()))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。