Pytorch基础

Leonhardt 2022-04-19 Python
  • Pytorch
About 2 min

# learning rate scheduler

学习率和优化器优化参数同时进行,所以step, T_max计算要考虑每轮迭代多少次。

import torch
import torch.nn as nn
from torch.optim.lr_scheduler import StepLR, CosineAnnealingLR

initial_lr = 0.1

class model(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3)
    def forward(self, x):
        pass

net = model()

optimizer = torch.optim.Adam(net.parameters(), lr=initial_lr)
scheduler = StepLR(optimizer, step_size=3, gamma=0.1) # 每过step_size个epoch,学习率乘以gamma
scheduler_cos = CosineAnnealingLR(optimizer, T_max=10, eta_min=0) # 学习率从初始逐渐降到eta_min,T_max指定总轮数

print("初始化的学习率:", optimizer.defaults['lr'])
for epoch in range(1, 11):
    # train

    optimizer.zero_grad()
    optimizer.step()
    print("第%d个epoch的学习率:%f" % (epoch, optimizer.param_groups[0]['lr']))
    # scheduler.step()
    scheduler_cos.step()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# nn.Module中的self.register_buffer()解析

该方法的作用是定义一组参数,该组参数的特别之处在于:模型训练时不会更新(即调用 optimizer.step() 后该组参数不会变化,只可人为地改变它们的值),但是保存模型时,该组参数又作为模型参数不可或缺的一部分被保存。

在用self.register_buffer('name', tensor) 定义模型参数时,其有两个形参需要传入。第一个是字符串,表示这组参数的名字;第二个就是tensor 形式的参数。

在模型定义中调用这个参数时(比如改变这组参数的值),可以使用self.name 获取。本文例中,就可用self.param_buf 引用。这和类属性的引用方法是一样的。

在实例化模型后,获取这组参数的值时,可以用 net.buffers() 方法获取,该方法返回一个生成器(可迭代变量)

实际上,PyTorch 定义的模型用OrderedDict() 的方式记录这三种类型,分别保存在self._modules, self._parameters 和 self._buffers 三个私有属性中。