optimizer.param_groups含义分析

文章讲述了在PyTorch中如何处理单个网络和多个网络参数的优化,包括将所有参数组合到一个param_groups中或分别设置不同学习率。重点介绍了optimizer.param_groups的结构和在处理多网络优化时的用法。
摘要由CSDN通过智能技术生成

optimizer.param_groups: 是一个list,其中的元素为字典


optimizer.param_groups[0]:是一个字典,一般包括[‘params’, ‘lr’, ‘betas’, ‘eps’, ‘weight_decay’, ‘amsgrad’, ‘maximize’]等参数(不同的优化器包含的可能略有不同,而且还可以额外人为添加键值对)

Pytorch的优化器中都有一个参数:params(model.parameters())。params就是网络中需要优化的网络参数,在这里需要注意的是传入的网络参数必须使可以迭代的对象。

情况一:如果我们只是想优化一个网络,那么我们就把一整个网络看做一个param_groups,params参数的赋值为model.parameters()。

import torch
import torch.nn as nn

# 定义网络
class Test(nn.Module):
    def __init__(self):
        super(Test, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(3, 8, 3),
            nn.ReLU(),
        )
        self.fc = nn.Sequential(
            nn.Linear(288, 5)
        )
 
    def forward(self, x):
        x = self.conv(x)
        x = torch.flatten(x, 1)
        print(x.shape)
        x = self.fc(x)
        return x
 
# 实例化网络
model = Test()

optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

print("只有一个网络时optimizer.param_groups(list类型)的长度:{}".format(len(optimizer.param_groups)))

输出:
只有一个网络时optimizer.param_groups(list类型)的长度:1

因为这里把整个网络看成了一个param_groups,所以这里的执行结果为:1。 

情况二:如果是同时优化多个网络参数,这里介绍两种方法:

a.将多个网络的参数合并到一起,当成一个网络的参数来进行优化一般的赋值方式为

import torch
import torch.nn as nn

# 定义网络
class Test(nn.Module):
    def __init__(self):
        super(Test, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(3, 8, 3),
            nn.ReLU(),
        )
        self.fc = nn.Sequential(
            nn.Linear(288, 5)
        )
 
    def forward(self, x):
        x = self.conv(x)
        x = torch.flatten(x, 1)
        print(x.shape)
        x = self.fc(x)
        return x

#此时有两个网络需要优化
model_1 = Test()

model_2 = Test()

optimizer = torch.optim.Adam([*model_1.parameters(), *model_2.parameters()], lr=0.01)

print("两个网络时optimizer.param_groups(list类型)的长度:{}".format(len(optimizer.param_groups)))

输出:
两个网络时optimizer.param_groups(list类型)的长度:1

 代码执行结果为:1。说明可以把多个网络参数合并成一个网络参数进行优化。

 b.多个网络分开优化,并且可以使用各不相同的学习率,赋值方式为: 

import torch
import torch.nn as nn

# 定义网络
class Test(nn.Module):
    def __init__(self):
        super(Test, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(3, 8, 3),
            nn.ReLU(),
        )
        self.fc = nn.Sequential(
            nn.Linear(288, 5)
        )
 
    def forward(self, x):
        x = self.conv(x)
        x = torch.flatten(x, 1)
        print(x.shape)
        x = self.fc(x)
        return x

#此时有两个网络需要优化
model_1 = Test()

model_2 = Test()

optimizer = torch.optim.Adam([{'params':model_1.parameters()},{'params':model_2.parameters(), 'lr': 0.2}], lr=0.01)

print("优化器里有多少个param_groups: ", len(optimizer.param_groups))

print("网络1的学习率为: ", optimizer.param_groups[0]['lr'])

print("网络2的学习率为: ", optimizer.param_groups[1]['lr'])

输出:
优化器里有多少个param_groups:  2
网络1的学习率为:  0.01
网络2的学习率为:  0.2

从结果中可以看出,每个param_groups中可以单独定义学习率lr,如果没有指定的话则默认采取后面的学习率。 

 

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值