深度学习——(6)pytorch冻结某些层的参数

深度学习——(6)pytorch冻结某些层的参数


在加载预训练模型的时候,有时候想冻结前面几层,使其参数在训练过程中不发生变化(不进行反向传播)

问题出现

在之前的blog——VGG16 图像分类中,使用如下语法

net = vgg(model_name=model_name, num_classes=1000,init_weights=True) # 没有训练好的权重,需要加载ImageNet的权重
net.load_state_dict(torch.load(pre_path, map_location=device))
for parameter in net.parameters():
        parameter.requires_grad = False

注:上面语句的含义我的理解是将所有的层都冻结
但是,出现了一个神奇的问题,当我打印每一层是否已经冻结,所有层的require_grad都显示为True。**在这里插入图片描述
这,这不就是意思把真个model已知都在反向传播吗??那我加载权重干什么??为了一探究竟,所以做了下面的尝试,想看看到底这个requires_grad是怎么一回事?

一探究竟

try 1. 不加requires_grad

当不加requires_grad的时候(上面代码不加后面两行),默认requires_grad=True,训练时候的loss值应该会很大,看看结果如何
在这里插入图片描述
确实很大!!!

try 2. 使用原来的格式更改(上面提到的)

如果使用前面提到的,那应该所有的参数都被冻结了,loss应该不会像上面那么大了,但是打印每一层的grad依然显示True。——反正就神奇!

for parameter in net.parameters(): #requires_grad==False 才不会反向传播,只训练下面部分(微调)
        parameter.requires_grad = False
for name, value in net.named_parameters():
        print('name: {0},\t grad: {1}'.format(name, value.requires_grad)) 

在这里插入图片描述
在这里插入图片描述

try 3. 定义no_grad列表将部分层冻结

这才是我的初衷,师兄也和我说先冻结前面的层,对后面的分类进行整体学习,然后放开全局进行微调。所以我的意愿是先冻结feature层进行学习。

no_grad = ['features.0.weight','features.0.bias',
           'features.2.weight','features.2.bias',
           'features.5.weight','features.5.bias',
           'features.7.weight','features.7.bias',
           'features.10.weight','features.10.bias',
           'features.12.weight','features.12.bias',
           'features.14.weight','features.14.bias',
           'features.17.weight','features.17.bias',
           'features.19.weight','features.19.bias',
           'features.21.weight','features.21.bias',
           'features.24.weight','features.24.bias',
           'features.26.weight','features.26.bias',
           'features.28.weight','features.28.bias'              
           ]
for name, value in net.named_parameters():
     if name in no_grad:
          value.requires_grad = False
     else:
          value.requires_grad = True
     print('name: {0},\t grad: {1}'.format(name, value.requires_grad))   

在这里插入图片描述
在这里插入图片描述
具体为什么还在和师兄讨论,真正明晰了继续更。也请知道原因的大家帮我解答疑惑,欢迎致电2535227524@qq.com

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
PyTorch冻结某些参数不训练可以通过以下步骤实现: 1. 加载 ResNet50 预训练模型: ```python import torchvision.models as models resnet50 = models.resnet50(pretrained=True) ``` 2. 冻结指定参数: ```python for name, param in resnet50.named_parameters(): if 'layer3' not in name and 'layer4' not in name: param.requires_grad = False ``` 上述代码中,我们遍历 ResNet50 模型的所有参数,如果参数名中不包含 "layer3" 和 "layer4",则将其 requires_grad 属性设置为 False,即冻结参数。 3. 将模型放到 GPU 上: ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') resnet50 = resnet50.to(device) ``` 4. 定义优化器和损失函数: ```python import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(filter(lambda p: p.requires_grad, resnet50.parameters()), lr=0.001, momentum=0.9) ``` 上述代码中,我们只优化 requires_grad 属性为 True 的参数,即未冻结参数。 5. 训练模型: ```python for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): inputs = inputs.to(device) labels = labels.to(device) optimizer.zero_grad() outputs = resnet50(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() ``` 上述代码中,我们使用 DataLoader 加载数据,并将输入和标签放到 GPU 上进行训练。由于部分参数冻结,因此反向传播时只会更新未冻结参数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚子味的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值