Pytorch与深度学习自查手册5-损失函数、优化器
Pytorch与深度学习自查手册5-损失函数、优化器
损失函数
可以直接使用官方自带的损失函数,也可以自定义损失函数。
自定义损失函数
包括两种形式:
- 直接以函数形式定义
- 当作模型的一层,通过继承nn.Module定义(推荐)
直接以函数形式定义
def my_loss(output, target): |
(推荐)当作模型的一层,通过继承nn.Module定义
import torch.nn as nn |
Pytorch自带损失函数
优化器
官方给出了很多优化器可以直接使用:pytorch优化器
优化器的使用
每个优化器都是一个类,一定要进行实例化才能使用,比如下方实现:
class Net(nn.Moddule):
···
net = Net()
optim = torch.optim.SGD(net.parameters(),lr=lr)
optim.step()optimizer在一个神经网络的epoch中需要实现下面两个步骤:
梯度置零
梯度更新
optimizer = torch.optim.SGD(net.parameters(), lr=1e-5)
for epoch in range(EPOCH):
...
optimizer.zero_grad() #梯度置零
loss = ... #计算loss
loss.backward() #BP反向传播
optimizer.step() #梯度更新
优化器的重要参数
Optimizer
属性:
defaults
:存储的是优化器的超参数,例子如下:{'lr': 0.1, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}
state
:参数的缓存,例子如下:defaultdict(<class 'dict'>, {tensor([[ 0.3864, -0.0131], [-0.1911, -0.4511]], requires_grad=True): {'momentum_buffer': tensor([[0.0052, 0.0052],[0.0052, 0.0052]])}})
param_groups
:管理的参数组,是一个list,其中每个元素是一个字典,顺序是params,lr,momentum,dampening,weight_decay,nesterov,例子如下:[{'params': [tensor([[-0.1022, -1.6890],[-1.5116, -1.7846]], requires_grad=True)], 'lr': 1, 'momentum': 0, 'dampening': 0, 'weight_decay': 0, 'nesterov': False}]
Optimizer
方法
zero_grad()
:清空所管理参数的梯度,PyTorch的特性是张量的梯度不自动清零,因此每次反向传播后都需要清空梯度。step()
:执行一步梯度更新,参数更新add_param_group()
:添加参数组load_state_dict()
:加载状态参数字典,可以用来进行模型的断点续训练,继续上次的参数进行训练state_dict()
:获取优化器当前状态信息字典
学习率控制器scheduler
同样分为官方提供和自定义两种方式。
官方提供的学习率控制器scheduler
pytorch可以利用optim中的scheduler动态控制学习率,常用的如:
lr_scheduler.LambdaLR
lr_scheduler.MultiplicativeLR
lr_scheduler.StepLR
lr_scheduler.MultiStepLR
lr_scheduler.ExponentialLR
lr_scheduler.CosineAnnealingLR
lr_scheduler.ReduceLROnPlateau
lr_scheduler.CyclicLR
lr_scheduler.OneCycleLR
lr_scheduler.CosineAnnealingWarmRestarts
设置方法如下:
# 选择一种优化器 |
注:
在使用官方给出的torch.optim.lr_scheduler
时,需要将scheduler.step()
放在optimizer.step()
后面进行使用。
自定义scheduler
通过自定义函数adjust_learning_rate
来改变param_group
中lr
的值,从而实现自定义scheduler。
假设需要学习率每30轮下降为原来的1/10,已有的官方API中没有符合我们需求的,那就需要自定义函数来实现学习率的改变。
def adjust_learning_rate(optimizer, epoch): |
在训练的过程就可以调用adjust_learning_rate
函数来实现学习率的动态变化:
def adjust_learning_rate(optimizer,...): |
参考资料
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 冬于的博客!
评论