PyTorch【6】常用优化器及损失函数

发布于:2022-12-06 ⋅ 阅读:(123) ⋅ 点赞:(0)

一.优化器

1.参数

optimizer = torch.optim.Adam(params,lr)

  • params:被优化的参数,通常为 model.parameters()
  • lr:学习率
  • 其余参数:不同的优化器有不同的具体参数

2.常用优化器

  • torch.optim.Adadelta()
  • torch.optim.Adagrad()
  • torch.optim.Adam()
  • torch.optim.Adamax()
  • torch.optim.ASGD()
  • torch.optim.LBFGS()
  • torch.optim.RMSprop()
  • torch.optim.Rprop()
  • torch.optim.SGD()

3.学习率的设置方式

(1).所有网络层有相同的学习率

optimizer = Adam(testnet.parameters(),lr=0.001)

(2).不同网络层有步同的学习率

optimizer = Adam(
    [{'params':model.hidden.parameters(),'lr':0.0001},
    {'params':model.regression.parameters(),'lr':0.01}],
    lr=1e-2 # 其他没有指定的所有参数
)

(3).不同的epoch设置不同的学习率

随着训练次数的增加,适当调整学习率会使得训练效果更好,达到这样的效果分为两步:

  • 选择合适的学习率更新表
  • 执行梯度更新
from torch.optim.lr_scheduler import LambdaLR,StepLR,MultiStepLR,ExponentialLR,CosineAnnealingLR

# 1.不同的参数组设置不同的学习调整策略
LambdaLR(optimizer,			# 优化器
         lr_lambda,			# 自定义调整规则
         last_epoch=-1,		# 始调整学习率的时间,默认-1表示初始值
         verbose=False		# 是否打印更新状态
)

# Example:
lambda1 = lambda epoch: epoch // 30
lambda2 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=[lambda1, lambda2])
for epoch in range(100):
    train(...)
    validate(...)
    scheduler.step()
    scheduler.get_lr()	# 获取当前的学习率

# 2.等间隔调整学习率
StepLR(
    optimizer,
    step_size,			# 学习率更新的epoch间隔
    gamma=0.1,			# 学习率调整为上个间隔的gamma倍
    last_epoch=-1,
    verbose=False
)

# Example:
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 60
# lr = 0.0005   if 60 <= epoch < 90
# ......
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)
for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()

# 3.按照设定的间隔调整学习率
MultiStepLR(
    optimizer,
    milestones,			# epoch间隔列表,必须递增
    gamma=0.1,			# 学习率调整为上个间隔的gamma倍
    last_epoch=-1,
    verbose=False)

# Example:
# lr = 0.05     if epoch < 30
# lr = 0.005    if 30 <= epoch < 80
# lr = 0.0005   if epoch >= 80
scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
for epoch in range(100):
     train(...)
     validate(...)
     scheduler.step()


# 4.按照实数衰减设置学习率
ExponentialLR(optimizer,gamma,last_epoch=-1,verbose=False)
	# lr 的变化情况为:lr = lr*(gamma^epoch)

# 5.余弦为周期,在每个周期最大值时调整学习率
CosineAnnealingLR(optimizer,T_max,eta_min=0,last_epoch=-1,verbose=False)
	# T_max (int): 迭代iterations次后重新调整学习率
	# eta_min (float): 每个epoch的最小学习率

二.损失函数

1.参数

# 均方误差
torch.nn.MSELoss(
    size_average=True,	# 计算的损失为每个batch的均值,否则为每个batch的和。未来会被reduction代替
    reduce=True,		# 是否根据size_average参数设定计算损失。未来会被reduction代替
    reduction='mean'	# 计算损失的方式:'none'|'mean'|'sum'。'mean':损失为每个batch的均值,'sum':损失为每个batch的和
)

# 交叉熵损失函数
torch.nn.CrossEntropyLoss(
    weight,
    size_average=True,
    ignore_index=True,
    reduction='mean',
    label_smoothing=0.0)	# 标签平滑系数

2.常用损失函数

名称 使用类型
torch.nn.L1Loss() 平均绝对值误差损失 回归
torch.nn.MSELoss() 均方误差损失 回归
torch.nn.CrossEntropyLoss() 交叉熵损失 多分类
torch.nn.NLLLoss() 负对数似然函数损失 多分类
torch.nn.NLLLoss2d() 图片负对数似然函数损失 图像分割
torch.nn.KLDivLoss() KL散度损失 回归
torch.nn.BCELoss() 二分类交叉熵损失函数 二分类
torch.nn.MarginRankingLoss() 评价相似度的损失
torch.nn.MultiLabelMarginLoss() 多标签分类的损失 多标签分类
torch.nn.SmoothL1Loss() 平滑的L1损失 回归
torch.nn.SoftMarginLoss() 多标签二分类问题的损失 多标签二分类

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到