(12)加载预训练模型之后loss先飙升后下降

参考:PyTorch模型加载与保存的最佳实践

 在训练yolov4时,加载预训练权重冻结主干参数训练50个epochs,然后解冻训练就出现了这种情况,使用的VOC2007+2012数据集。但是后来训练mobilenet-yolov4时,加载主干网络权重没有出现这种情况?

`torchvision`是一个PyTorch库,它包含了常用的计算机视觉数据集和图像处理工具。在使用`torchvision`加载预训练模型并进行微调时,通常需要经过以下几个步骤: 1. **导入所需模块**: 首,你需要导入`torchvision.models`,这将提供预训练模型,以及`torch.nn.Module`用于创建和管理模型。 ```python import torch from torchvision import models ``` 2. **选择预训练模型**: 根据你的任务需求,从`models`模块中选择一个预训练模型,比如对于图像分类任务,你可以选择`resnet18`, `alexnet`, 或者`densenet161`等。 ```python model = models.resnet18(pretrained=True) ``` 这里的`pretrained=True`表示模型已经被预训练在ImageNet上。 3. **冻结部分层**: 微调通常发生在模型的最后几层,前几层(如卷积层)已经学习了通用特征。可以设置这些层为不可训练状态,防止其权重改变影响基础特征。 ```python for param in model.parameters(): param.requires_grad = False # 只对特定层(例如最后一个全连接层fc)进行微调 for param in model.fc.parameters(): param.requires_grad = True ``` 4. **准备数据和损失函数**: 调整数据加载器和适当的损失函数,比如交叉熵loss。 5. **开始微调**: 将模型放入一个训练循环中,使用优化器更新微调层的权重。 ```python optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.001) # 使用SGD或其他优化器 criterion = nn.CrossEntropyLoss() # 训练过程 for epoch in range(num_epochs): for inputs, labels in dataloader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值