【pytorch】利用requires_grad冻结部分网络参数

代码示例:

import torch
import torch.nn as nn


class a1(torch.nn.Module):
    def __init__(self):
        super(a1, self).__init__()
        self.l1 = nn.Linear(3, 2)


class aa(a1):
    def __init__(self):
        super(aa, self).__init__()
        self.a = ''
        self.b = 'c'
        self.l2 = nn.Linear(2, 2)
        self.l3 = nn.Linear(2, 1)

    def forward(self, x):
        e1 = self.l1(x)
        e2 = self.l2(e1)
        e3 = self.l3(e2)
        return e3


a = aa()
freeze_layers = ['l2', 'l3']
opt_param = []
for name, module in a._modules.items():
    if name not in freeze_layers:
        for p in module.parameters():
            opt_param.append(p)
    else:
        for p in module.parameters():
            p.requires_grad = False

print('original parameters:\n', list(a.parameters()))

x = torch.tensor([[1, 2, 3], [4, 5, 6], [-1, -2, -3], [-2, -4, -5]], dtype=torch.float)
y = torch.tensor([1, 1, -1, -1], dtype=torch.float)
y = y.view(4, -1)
y_ = a(x)
print('y_', y_)
celoss = nn.MSELoss()
loss = celoss(y, y_)
opt = torch.optim.Adam(opt_param)
loss.backward()
opt.step()

print('new parameters:\n', list(a.parameters()))

输出:

original parameters:
 [Parameter containing:
tensor([[-0.0965, -0.3446,  0.0866],
        [-0.1677, -0.2664,  0.5007]], requires_grad=True), Parameter containing:
tensor([ 0.2607, -0.3101], requires_grad=True), Parameter containing:
tensor([[0.5237, 0.1328],
        [0.6994, 0.1014]]), Parameter containing:
tensor([ 0.2662, -0.1830]), Parameter containing:
tensor([[-0.0303,  0.1869]]), Parameter containing:
tensor([0.1692])]

y_  tensor([[ 0.1037],
        [-0.0155],
        [ 0.2007],
        [ 0.2665]], grad_fn=<AddmmBackward>)
new parameters:
 [Parameter containing:
tensor([[-0.0955, -0.3436,  0.0876],
        [-0.1667, -0.2654,  0.5017]], requires_grad=True), Parameter containing:
tensor([ 0.2597, -0.3111], requires_grad=True), Parameter containing:
tensor([[0.5237, 0.1328],
        [0.6994, 0.1014]]), Parameter containing:
tensor([ 0.2662, -0.1830]), Parameter containing:
tensor([[-0.0303,  0.1869]]), Parameter containing:
tensor([0.1692])]

 

可以看到l2和l3两层网络被冻结了

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 上进行训练。由于部分参数冻结,因此反向传播时只会更新未冻结参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值