这里先给出使用的一个小型网络(自己瞎定义的一个网络),后面使用的model就是这里定义的一个小型的网络:
# 定义网络
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()
Pytorch的优化器中都有一个参数:params。在这里就详细描述一下params。
params就是网络中需要优化的网络参数,在这里需要注意的是传入的网络参数必须使可以迭代的对象。
(1)如果我们只是想优化一个网络,那么我们就把一整个网络看做一个param_groups,params参数的赋值为model.parameters()。
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
print(len(optimizer.param_groups))
因为这里我们把整个网络看做一个param_groups,所以这里我们的执行结果为:1。
(2)如果我们想要的是同时优化多个网络的参数,这里介绍两种方法:
a.我们将多个网络的参数合并到一起,当成一个网络的参数来进行优化一般的赋值方式为
model_1 = Test()
model_2 = Test()
optimizer = torch.optim.Adam([*model_1.parameters(), *model_2.parameters()], lr=0.01)
print(len(optimizer.param_groups))
代码的执行结果为:1。这样我们就可以把多个网络参数合并成一个网络参数进行优化。
b.多个网络分开优化,并且可以使用各不相同的学习率,赋值方式为:
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,如果没有指定的话则默认采取后面的学习率。