pytorch冻结模型

该博客介绍了如何在PyTorch中对预训练的ResNet18模型进行微调。通过设置模型参数的requires_grad属性为False,可以冻结除最后一层之外的所有层,避免其权重在训练过程中更新。模型的最后一层被替换为一个线性层,用于适应新的任务。随后,使用SGD优化器仅更新新层的参数,设置合适的学习率和动量。
摘要由CSDN通过智能技术生成

当您想要冻结部分模型时,或者您事先知道不会使用某些参数的梯度。

例如,如果要对预先训练的CNN进行优化,只要切换冻结模型中的requires_grad标志就足够了,

直到计算到最后一层才会保存中间缓冲区,其中的仿射变换(卷级操作等)将使用需要梯度的权重并且网络的输出也将需要它们。

import torchvision
import torch.nn as nn
from torch import optim
model = torchvision.models.resnet18(pretrained=True)
for param in model.parameters():
    param.requires_grad=False

model.fc = nn.Linear(512,100)

optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)

这里将最后一层替换成了 model.fc = nn.Linear(512,100)原先是renet18中是,nn.Linear(512,1000)

 

PyTorch中,冻结Batch Normalization(BN)层的常见做法是将其设置为eval模式,并将其track_running_stats属性设置为False。这样做可以防止BN层参与训练过程中的梯度更新。以下是几种常见的冻结BN层的方法: 方法一: 在加载预训练模型时,需要使用以下代码来冻结BN层: ```python def freeze_bn(m): classname = m.__class__.__name__ if classname.find('BatchNorm') != -1: m.eval() model.apply(freeze_bn) ``` 这段代码会将模型中所有的BN层设置为eval模式,从而冻结它们的参数。 方法二: 如果在自己定义的模型中需要冻结特征提取层(pretrain layer)的BN层,可以按如下方式修改train函数: ```python def train(self, mode=True): super(fintuneNet, self).train(mode) if self.args.freeze_bn and mode==True: self.branch_cnn.apply(self.fix_bn) return self def fix_bn(self, m): classname = m.__class__.__name__ if classname.find('BatchNorm') != -1: m.eval() m.track_running_stats = False for name, p in m.named_parameters(): p.requires_grad = False ``` 这段代码会将模型中特征提取层的BN层设置为eval模式,并将其track_running_stats属性设置为False,同时将参数的requires_grad属性设置为False,从而冻结这些层的参数。 另外,可以阅读一篇名为"Pytorch BN(BatchNormal)计算过程与源码分析和train与eval的区别"的文章,该文章对PyTorch中BN层的计算过程以及train和eval模式的区别进行了详细分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值